SlideShare une entreprise Scribd logo
1  sur  38
Télécharger pour lire hors ligne
cgi programs
rise from ash then burn again
upon each request
Continuity
A continuation based web application
            library for perl.


   Brock Wilcox (awwaiid@thelackthereof.org)

        Pittsburgh Perl Workshop 2007

           http://continuity.tlt42.org/
Talk Overview
●   Traditional Web Apps
●   Continuation Based Web Apps
●   Seaside
●   Continuity
Memento
Memento
●   Do an action
●   What did I just do? Ask the requestor
●   What did I just do? Look for a sticky note
    (cookie)
CGI Applications
●   Restart on each request
●   Start with a switch statement
●   GOTO based on input
●   Control flow logic spread out
●   Switch statement is state machine
Run Lola Run
Run Lola Run
●   Capture a moment in time
●   Put it in a variable
●   Execute it later
●   Execute it again?
●   Welcome to Continuations
Continuation Conshminuation
●   Program state in a variable
    –   Not just data! Control flow too!
●   One-shot vs Multi-shot
●   Coroutines
●   Cooperative Multithreading
Continuations in Web Apps
●   Don't restart app
●   Continue on source next line
●   Keep program state (local vars)
●   Centralize control flow logic
Other Efforts
●   ViaWeb (Lisp, Paul Grahm 1999)
●   Seaside (Smalltalk)
●   UnCommon Web, SISCweb (Scheme)
●   RIFE (Java)
●   ... AJAX Turns Things Inside Out Too ...
Seaside
Overview of Seaside
●   Continuations
●   No templates
●   Components
●   Generated HTML with callbacks
Seaside Demo
●   Counter example
●   Halos
●   In-page code browser
●   Inline link-press callbacks
This is

SWEET
I want this in

 Perl
Continuations in Perl5
●   Nothing built-in
●   High-level trickery (Contize)
●   Low-level trickery (Coro)
●   Other trickery?
●   use v6;
use Coro;
Coro
●   Written by Marc Lehmann
●   Coroutines for Perl
●   Saves
    –   callchain
    –   lexical variables
    –   @_ $_ $@ $/
    –   C stack
●   Effectively one-shot continuations
●   Plus other goodies!
Continuity
Continuity
●   Keep a list of continuations
●   Accept incoming HTTP requests
●   Map to a continuation
●   Repeat
Continuity Design
●   Library Not Framework
●   Unobtrusive
●   TMTOWTDI
●   Foundation for higher abstraction
●   Modular
    –   Plugable Adaptors: HttpDaemon, FastCGI, ...
    –   Session Mapper
What is it Good For
●   High interaction
●   Shared state - games
●   Command line conversions
●   Clean, organized code
Continuation Mapping
●   Incoming request to continuation
    –   Cookie
    –   IP
    –   Path
    –   Query
●   Path + Cookie is fun
●   Query is my favorite
Counter Example
●   Demonstrates:
    –   Server setup
    –   Cookie sessions
    –   Query sessions
    –   Parameters
    –   Input loop
    –   Subroutines if we make a prompt
Chat Example
●   Demonstrates
    –   All things as Counter Example
    –   AJAX and COMET
    –   Multi-Continuation Sessions
Issues
●   Back Button
●   Bookmarks
●   Security
●   Scalability
Back Buttons and Bookmarks
●   URLs should be pretty
●   Many techniques to choose from
●   Continuity doesn't decide for you
●   Seaside mostly gives up, uses Request ID
Detect the Back Button
●   Send a unique Request ID
●   Duplicates imply Back, Reload, or Fork
●   Set flag, raise exception, ignore
Bookmarks
●   Bring back the CASE statement
●   Goto the right spot :)
●   Continue from there
●   URLs for major parts of application
Security
●   Easy to centralize Input and Output
●   Guessing a ContinuationID is bad
Scalability
●   Difficult to scale?
●   Serve dynamic data (not static stuff)
●   Session Affinity
●   Don't fix it if it ain't broke
Advanced Techniques
●   Subref callbacks
●   Multiple continuations per session
●   Event.pm timers and watchers
Future Work
●   Get people using it
●   Feedback!
Future Work
●   High-level layer(s) on top
●   Continuity + Moose + DBIx::Class
●   Steal from Seaside
●   Steal from Magritte
●   Steal from everyone
Future Work
●   Easy DBI interface
    –   Coro::Util::eval_fork
●   Other languages, keep similar minimal
    API
Get it on CPAN.
The End

Contenu connexe

Tendances

Ajax Tutorial
Ajax TutorialAjax Tutorial
Ajax Tutorial
oscon2007
 
Hands on performance testing and analysis with web pagetest
Hands on performance testing and analysis with web pagetestHands on performance testing and analysis with web pagetest
Hands on performance testing and analysis with web pagetest
Patrick Meenan
 
Automating JavaScript testing with Jasmine and Perl
Automating JavaScript testing with Jasmine and PerlAutomating JavaScript testing with Jasmine and Perl
Automating JavaScript testing with Jasmine and Perl
nohuhu
 
Developing Rich Internet Applications with Perl and JavaScript
Developing Rich Internet Applications with Perl and JavaScriptDeveloping Rich Internet Applications with Perl and JavaScript
Developing Rich Internet Applications with Perl and JavaScript
nohuhu
 

Tendances (20)

Ajax Tutorial
Ajax TutorialAjax Tutorial
Ajax Tutorial
 
Ruby и TestComplete
Ruby и TestCompleteRuby и TestComplete
Ruby и TestComplete
 
Hands on performance testing and analysis with web pagetest
Hands on performance testing and analysis with web pagetestHands on performance testing and analysis with web pagetest
Hands on performance testing and analysis with web pagetest
 
Indexing BackPAN
Indexing BackPANIndexing BackPAN
Indexing BackPAN
 
Benefits of Reactive Programming with Reactor and Spring Boot 2 - Violeta Geo...
Benefits of Reactive Programming with Reactor and Spring Boot 2 - Violeta Geo...Benefits of Reactive Programming with Reactor and Spring Boot 2 - Violeta Geo...
Benefits of Reactive Programming with Reactor and Spring Boot 2 - Violeta Geo...
 
BackPAN Archeology
BackPAN ArcheologyBackPAN Archeology
BackPAN Archeology
 
Automating JavaScript testing with Jasmine and Perl
Automating JavaScript testing with Jasmine and PerlAutomating JavaScript testing with Jasmine and Perl
Automating JavaScript testing with Jasmine and Perl
 
MyCPAN ( LA.pm, September 2007 )
MyCPAN ( LA.pm, September 2007 )MyCPAN ( LA.pm, September 2007 )
MyCPAN ( LA.pm, September 2007 )
 
Benefits of Reactive Programming with Reactor and Spring Boot 2 - Violeta Geo...
Benefits of Reactive Programming with Reactor and Spring Boot 2 - Violeta Geo...Benefits of Reactive Programming with Reactor and Spring Boot 2 - Violeta Geo...
Benefits of Reactive Programming with Reactor and Spring Boot 2 - Violeta Geo...
 
Tutorial sederhana netbeans & xampp
Tutorial sederhana netbeans & xamppTutorial sederhana netbeans & xampp
Tutorial sederhana netbeans & xampp
 
Developing Rich Internet Applications with Perl and JavaScript
Developing Rich Internet Applications with Perl and JavaScriptDeveloping Rich Internet Applications with Perl and JavaScript
Developing Rich Internet Applications with Perl and JavaScript
 
Reintroducing Web Technology
Reintroducing Web TechnologyReintroducing Web Technology
Reintroducing Web Technology
 
The Mysteries Of JavaScript-Fu (@media SF Edition)
The Mysteries Of JavaScript-Fu (@media SF Edition)The Mysteries Of JavaScript-Fu (@media SF Edition)
The Mysteries Of JavaScript-Fu (@media SF Edition)
 
The Current State of Asynchronous Processing With Ruby
The Current State of Asynchronous Processing With RubyThe Current State of Asynchronous Processing With Ruby
The Current State of Asynchronous Processing With Ruby
 
Performance Improvements in Browsers
Performance Improvements in BrowsersPerformance Improvements in Browsers
Performance Improvements in Browsers
 
JAZOON'13 - Andrej Vckovski - Go synchronized
JAZOON'13 - Andrej Vckovski - Go synchronizedJAZOON'13 - Andrej Vckovski - Go synchronized
JAZOON'13 - Andrej Vckovski - Go synchronized
 
All Aboard The Stateful Train
All Aboard The Stateful TrainAll Aboard The Stateful Train
All Aboard The Stateful Train
 
Brief Introduction to Concurrent Programming
Brief Introduction to Concurrent ProgrammingBrief Introduction to Concurrent Programming
Brief Introduction to Concurrent Programming
 
Varnish to the rescue
Varnish to the rescueVarnish to the rescue
Varnish to the rescue
 
Asynchronous Processing with Ruby on Rails (RailsConf 2008)
Asynchronous Processing with Ruby on Rails (RailsConf 2008)Asynchronous Processing with Ruby on Rails (RailsConf 2008)
Asynchronous Processing with Ruby on Rails (RailsConf 2008)
 

En vedette (14)

Consumer Math Slides October 15, 2007
Consumer Math Slides October 15, 2007Consumer Math Slides October 15, 2007
Consumer Math Slides October 15, 2007
 
Felicitació
FelicitacióFelicitació
Felicitació
 
Etichette per costruire significato
Etichette per costruire significatoEtichette per costruire significato
Etichette per costruire significato
 
Slides Elearning Plenary 1
Slides Elearning Plenary 1Slides Elearning Plenary 1
Slides Elearning Plenary 1
 
Como Los Arboles Sil
Como Los Arboles SilComo Los Arboles Sil
Como Los Arboles Sil
 
Imbus
ImbusImbus
Imbus
 
math lesson
math lessonmath lesson
math lesson
 
Encuadre Primer Bimestre
Encuadre Primer BimestreEncuadre Primer Bimestre
Encuadre Primer Bimestre
 
Realmachupicchu
RealmachupicchuRealmachupicchu
Realmachupicchu
 
Presentazione E Lis
Presentazione E LisPresentazione E Lis
Presentazione E Lis
 
Cell Organelles Complete 2
Cell Organelles Complete 2Cell Organelles Complete 2
Cell Organelles Complete 2
 
Exercici 3
Exercici 3Exercici 3
Exercici 3
 
Precentacion Compo
Precentacion CompoPrecentacion Compo
Precentacion Compo
 
Tema 1
Tema 1Tema 1
Tema 1
 

Similaire à PPW2007 - Continuity Project

iPhone Development For Experienced Web Developers
iPhone Development For Experienced Web DevelopersiPhone Development For Experienced Web Developers
iPhone Development For Experienced Web Developers
lisab517
 
Harish Understanding Aspnet
Harish Understanding AspnetHarish Understanding Aspnet
Harish Understanding Aspnet
rsnarayanan
 
Performance Improvements In Browsers
Performance Improvements In BrowsersPerformance Improvements In Browsers
Performance Improvements In Browsers
GoogleTecTalks
 
Automated Performance Testing With J Meter And Maven
Automated  Performance  Testing With  J Meter And  MavenAutomated  Performance  Testing With  J Meter And  Maven
Automated Performance Testing With J Meter And Maven
PerconaPerformance
 

Similaire à PPW2007 - Continuity Project (20)

Capistrano
CapistranoCapistrano
Capistrano
 
iPhone Development For Experienced Web Developers
iPhone Development For Experienced Web DevelopersiPhone Development For Experienced Web Developers
iPhone Development For Experienced Web Developers
 
Qcon
QconQcon
Qcon
 
Going Live! with Comet
Going Live! with CometGoing Live! with Comet
Going Live! with Comet
 
Harish Understanding Aspnet
Harish Understanding AspnetHarish Understanding Aspnet
Harish Understanding Aspnet
 
Comet: an Overview and a New Solution Called Jabbify
Comet: an Overview and a New Solution Called JabbifyComet: an Overview and a New Solution Called Jabbify
Comet: an Overview and a New Solution Called Jabbify
 
Http Status Report
Http Status ReportHttp Status Report
Http Status Report
 
JCatapult
JCatapultJCatapult
JCatapult
 
Web Development: The Next Five Years
Web Development: The Next Five YearsWeb Development: The Next Five Years
Web Development: The Next Five Years
 
Galaxy
GalaxyGalaxy
Galaxy
 
Skype Development Techniques and Tools
Skype Development Techniques and ToolsSkype Development Techniques and Tools
Skype Development Techniques and Tools
 
Building production websites with Node.js on the Microsoft stack
Building production websites with Node.js on the Microsoft stackBuilding production websites with Node.js on the Microsoft stack
Building production websites with Node.js on the Microsoft stack
 
Performance Improvements In Browsers
Performance Improvements In BrowsersPerformance Improvements In Browsers
Performance Improvements In Browsers
 
Performance Improvements in Browsers
Performance Improvements in BrowsersPerformance Improvements in Browsers
Performance Improvements in Browsers
 
The Recording HTTP Proxy: Not Yet Another Messiah - Bulgaria PHP 2019
The Recording HTTP Proxy: Not Yet Another Messiah - Bulgaria PHP 2019The Recording HTTP Proxy: Not Yet Another Messiah - Bulgaria PHP 2019
The Recording HTTP Proxy: Not Yet Another Messiah - Bulgaria PHP 2019
 
Django 101
Django 101Django 101
Django 101
 
Automated Performance Testing With J Meter And Maven
Automated  Performance  Testing With  J Meter And  MavenAutomated  Performance  Testing With  J Meter And  Maven
Automated Performance Testing With J Meter And Maven
 
Whats New In Silverlight 3
Whats New In Silverlight 3Whats New In Silverlight 3
Whats New In Silverlight 3
 
PAC 2019 virtual Mark Tomlinson
PAC 2019 virtual Mark TomlinsonPAC 2019 virtual Mark Tomlinson
PAC 2019 virtual Mark Tomlinson
 
Kostiantyn Yelisavenko "Mastering Macro Benchmarking in .NET"
Kostiantyn Yelisavenko "Mastering Macro Benchmarking in .NET"Kostiantyn Yelisavenko "Mastering Macro Benchmarking in .NET"
Kostiantyn Yelisavenko "Mastering Macro Benchmarking in .NET"
 

Plus de awwaiid

Plus de awwaiid (8)

2015-10-07 PPDC HTTP Adapters
2015-10-07 PPDC HTTP Adapters2015-10-07 PPDC HTTP Adapters
2015-10-07 PPDC HTTP Adapters
 
2016-05-12 DCRUG React.rb
2016-05-12 DCRUG React.rb2016-05-12 DCRUG React.rb
2016-05-12 DCRUG React.rb
 
Random. Kinda.
Random. Kinda.Random. Kinda.
Random. Kinda.
 
Mad Science: Polyglot Bridges
Mad Science: Polyglot BridgesMad Science: Polyglot Bridges
Mad Science: Polyglot Bridges
 
A Partial Multiverse Model of Time Travel for Debugging
A Partial Multiverse Model of Time Travel for DebuggingA Partial Multiverse Model of Time Travel for Debugging
A Partial Multiverse Model of Time Travel for Debugging
 
Rakudo
RakudoRakudo
Rakudo
 
RailsGirls DC 2012 - Debugging
RailsGirls DC 2012 - DebuggingRailsGirls DC 2012 - Debugging
RailsGirls DC 2012 - Debugging
 
NoiseGen at Arlington Ruby 2012
NoiseGen at Arlington Ruby 2012NoiseGen at Arlington Ruby 2012
NoiseGen at Arlington Ruby 2012
 

Dernier

CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
giselly40
 

Dernier (20)

The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 

PPW2007 - Continuity Project

  • 1. cgi programs rise from ash then burn again upon each request
  • 2. Continuity A continuation based web application library for perl. Brock Wilcox (awwaiid@thelackthereof.org) Pittsburgh Perl Workshop 2007 http://continuity.tlt42.org/
  • 3. Talk Overview ● Traditional Web Apps ● Continuation Based Web Apps ● Seaside ● Continuity
  • 5. Memento ● Do an action ● What did I just do? Ask the requestor ● What did I just do? Look for a sticky note (cookie)
  • 6. CGI Applications ● Restart on each request ● Start with a switch statement ● GOTO based on input ● Control flow logic spread out ● Switch statement is state machine
  • 8. Run Lola Run ● Capture a moment in time ● Put it in a variable ● Execute it later ● Execute it again? ● Welcome to Continuations
  • 9. Continuation Conshminuation ● Program state in a variable – Not just data! Control flow too! ● One-shot vs Multi-shot ● Coroutines ● Cooperative Multithreading
  • 10. Continuations in Web Apps ● Don't restart app ● Continue on source next line ● Keep program state (local vars) ● Centralize control flow logic
  • 11. Other Efforts ● ViaWeb (Lisp, Paul Grahm 1999) ● Seaside (Smalltalk) ● UnCommon Web, SISCweb (Scheme) ● RIFE (Java) ● ... AJAX Turns Things Inside Out Too ...
  • 13. Overview of Seaside ● Continuations ● No templates ● Components ● Generated HTML with callbacks
  • 14. Seaside Demo ● Counter example ● Halos ● In-page code browser ● Inline link-press callbacks
  • 16. I want this in Perl
  • 17. Continuations in Perl5 ● Nothing built-in ● High-level trickery (Contize) ● Low-level trickery (Coro) ● Other trickery? ● use v6;
  • 19. Coro ● Written by Marc Lehmann ● Coroutines for Perl ● Saves – callchain – lexical variables – @_ $_ $@ $/ – C stack ● Effectively one-shot continuations ● Plus other goodies!
  • 21. Continuity ● Keep a list of continuations ● Accept incoming HTTP requests ● Map to a continuation ● Repeat
  • 22. Continuity Design ● Library Not Framework ● Unobtrusive ● TMTOWTDI ● Foundation for higher abstraction ● Modular – Plugable Adaptors: HttpDaemon, FastCGI, ... – Session Mapper
  • 23. What is it Good For ● High interaction ● Shared state - games ● Command line conversions ● Clean, organized code
  • 24. Continuation Mapping ● Incoming request to continuation – Cookie – IP – Path – Query ● Path + Cookie is fun ● Query is my favorite
  • 25. Counter Example ● Demonstrates: – Server setup – Cookie sessions – Query sessions – Parameters – Input loop – Subroutines if we make a prompt
  • 26. Chat Example ● Demonstrates – All things as Counter Example – AJAX and COMET – Multi-Continuation Sessions
  • 27. Issues ● Back Button ● Bookmarks ● Security ● Scalability
  • 28. Back Buttons and Bookmarks ● URLs should be pretty ● Many techniques to choose from ● Continuity doesn't decide for you ● Seaside mostly gives up, uses Request ID
  • 29. Detect the Back Button ● Send a unique Request ID ● Duplicates imply Back, Reload, or Fork ● Set flag, raise exception, ignore
  • 30. Bookmarks ● Bring back the CASE statement ● Goto the right spot :) ● Continue from there ● URLs for major parts of application
  • 31. Security ● Easy to centralize Input and Output ● Guessing a ContinuationID is bad
  • 32. Scalability ● Difficult to scale? ● Serve dynamic data (not static stuff) ● Session Affinity ● Don't fix it if it ain't broke
  • 33. Advanced Techniques ● Subref callbacks ● Multiple continuations per session ● Event.pm timers and watchers
  • 34. Future Work ● Get people using it ● Feedback!
  • 35. Future Work ● High-level layer(s) on top ● Continuity + Moose + DBIx::Class ● Steal from Seaside ● Steal from Magritte ● Steal from everyone
  • 36. Future Work ● Easy DBI interface – Coro::Util::eval_fork ● Other languages, keep similar minimal API
  • 37. Get it on CPAN.