<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: kobaken</title>
    <description>The latest articles on DEV Community by kobaken (@kfly8).</description>
    <link>https://dev.to/kfly8</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F41425%2F786e3464-3f61-4ec4-b395-d28066e31c21.jpeg</url>
      <title>DEV Community: kobaken</title>
      <link>https://dev.to/kfly8</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kfly8"/>
    <language>en</language>
    <item>
      <title>Released Test2::Plugin::SubtestFilter which filters tests by subtest name.</title>
      <dc:creator>kobaken</dc:creator>
      <pubDate>Mon, 20 Oct 2025 23:39:16 +0000</pubDate>
      <link>https://dev.to/kfly8/released-test2pluginsubtestfilter-which-filters-tests-by-subtest-name-18mh</link>
      <guid>https://dev.to/kfly8/released-test2pluginsubtestfilter-which-filters-tests-by-subtest-name-18mh</guid>
      <description>&lt;p&gt;I have released &lt;a href="https://metacpan.org/release/KFLY/Test2-Plugin-SubtestFilter-0.01/view/lib/Test2/Plugin/SubtestFilter.pm" rel="noopener noreferrer"&gt;Test2::Plugin::SubtestFilter&lt;/a&gt; for Perl tests, which allows filtering test targets by subtest name, similar to &lt;code&gt;--testNamePattern&lt;/code&gt; in jest and vitest. I think it is useful when you want to run only specific tests.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="c1"&gt;# t/test.t&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;Test2::&lt;/span&gt;&lt;span class="nv"&gt;V0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;Test2::Plugin::&lt;/span&gt;&lt;span class="nv"&gt;SubtestFilter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nv"&gt;subtest&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;subtest&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;nested foo1&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;ok&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="nv"&gt;subtest&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;nested foo2&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;ok&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nv"&gt;subtest&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;baz&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;ok&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nv"&gt;done_testing&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Run tests matching `foo1`
❯ SUBTEST_FILTER=foo1 prove -lvr t/test.t
t/test.t ..
# Seeded srand with seed '20251020' from local date.
ok 1 - foo {
    ok 1 - nested foo1 {
        ok 1
        1..1
    }
    ok 2 - nested foo2 # skip
    1..2
}
ok 2 - baz # skip
1..2
ok
All tests successful.
Files=1, Tests=2,  0 wallclock secs ( 0.00 usr  0.00 sys +  0.04 cusr  0.00 csys =  0.04 CPU)
Result: PASS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>perl</category>
    </item>
    <item>
      <title>Released an Inertia.js Adapter for Mojolicious</title>
      <dc:creator>kobaken</dc:creator>
      <pubDate>Mon, 15 Sep 2025 07:18:19 +0000</pubDate>
      <link>https://dev.to/kfly8/released-an-inertiajs-adapter-for-mojolicious-32ph</link>
      <guid>https://dev.to/kfly8/released-an-inertiajs-adapter-for-mojolicious-32ph</guid>
      <description>&lt;p&gt;Hi, I'm &lt;a href="https://x.com/kfly8" rel="noopener noreferrer"&gt;kobaken&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I've released an adapter for using &lt;a href="https://inertiajs.com/" rel="noopener noreferrer"&gt;Inertia.js&lt;/a&gt; with Mojolicious, a Perl backend framework. Inertia.js is a bridging library that connects backend frameworks with components written in React, Vue, and other frameworks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://metacpan.org/pod/Mojolicious::Plugin::Inertia" rel="noopener noreferrer"&gt;https://metacpan.org/pod/Mojolicious::Plugin::Inertia&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Inertia.js?
&lt;/h2&gt;

&lt;p&gt;Inertia.js is a framework that connects backend frameworks with React or Vue components. It allows you to use modern frontend components while maintaining a traditional backend approach.&lt;/p&gt;

&lt;p&gt;I figure this is an approach that fits well when you have substantial assets on the backend side, but replacing everything would be too costly, and you want to start by improving the client-side experience.&lt;/p&gt;

&lt;p&gt;When using components written in React, Vue, etc. with backend frameworks like Mojolicious, I believe there are two approaches. One is to mix JavaScript code into the backend framework's proprietary template engine. The other is to call backend APIs and handle rendering with CSR or SSR. Both approaches result in more complex architecture compared to the days when you could simply select a template on the backend and pass values to it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgvj8cgq5rk0nr8b8c7g9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgvj8cgq5rk0nr8b8c7g9.png" alt="Classic Approach" width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With Inertia.js, you can use React and other components while maintaining the good old way of writing code. Specifically, it works as follows: by writing $c-&amp;gt;inertia(COMPONENT, PROPS) on the backend side, Inertia.js will connect with the component.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi9xnj59k6vasf7dxqpky.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi9xnj59k6vasf7dxqpky.png" alt="Mojolicious::Plugin::Inertia usage (backend)" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fejwclh5v04i3w2qw09on.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fejwclh5v04i3w2qw09on.png" alt="Mojolicious::Plugin::Inertia usage (client component)" width="800" height="545"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Inertia.js is the simple protocol
&lt;/h2&gt;

&lt;p&gt;Another point I found appealing is that the protocol for this connection is simple. It's remarkably simple.&lt;/p&gt;

&lt;p&gt;For example, if you write it like this...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="nv"&gt;$c&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;inertia&lt;/span&gt;&lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;Index&lt;/span&gt;&lt;span class="p"&gt;',&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="s"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Mojolicious&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It returns this JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"component"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Index"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"props"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mojolicious"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"c53bc3824540ea95b1e9b495c7a01a9d"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So straightforward!&lt;/p&gt;

&lt;p&gt;In fact, looking at &lt;a href="https://inertiajs.com/the-protocol" rel="noopener noreferrer"&gt;Inertia.js's protocol&lt;/a&gt;, it's content you can finish reading in about 10 minutes, and &lt;a href="https://metacpan.org/dist/Mojolicious-Plugin-Inertia/source/lib/Mojolicious/Plugin/Inertia.pm" rel="noopener noreferrer"&gt;Mojo's plugin is less than 100 lines&lt;/a&gt;, so I think it would be easy to port to other Perl frameworks.&lt;/p&gt;

&lt;p&gt;Recently, in another project, I made React Server Components usable with Hono, but understanding that in 10 minutes is difficult for me 😅 Since Inertia.js becomes CSR, I think React Server Components is better if you're looking for user experience and SEO, but I believe there are situations where Inertia.js is sufficient.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://zenn.dev/kfly8/articles/hono-meets-vite-rsc" rel="noopener noreferrer"&gt;https://zenn.dev/kfly8/articles/hono-meets-vite-rsc&lt;/a&gt; (Japanese)&lt;/p&gt;




&lt;p&gt;Please give it a try if you'd like!&lt;/p&gt;

</description>
      <category>perl</category>
      <category>mojolicious</category>
      <category>inertiajs</category>
    </item>
    <item>
      <title>Type library kura meets built-in class.</title>
      <dc:creator>kobaken</dc:creator>
      <pubDate>Mon, 25 Nov 2024 07:31:46 +0000</pubDate>
      <link>https://dev.to/kfly8/type-library-kura-meets-built-in-class-1ki4</link>
      <guid>https://dev.to/kfly8/type-library-kura-meets-built-in-class-1ki4</guid>
      <description>&lt;p&gt;&lt;a href="https://metacpan.org/pod/kura" rel="noopener noreferrer"&gt;https://metacpan.org/pod/kura&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The type library kura now possible to use the Perl with built-in class. This allows you to gather objects and types.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;v5&lt;/span&gt;&lt;span class="mf"&gt;.40&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;experimental&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;class&lt;/span&gt;&lt;span class="p"&gt;';&lt;/span&gt;

&lt;span class="nv"&gt;class&lt;/span&gt; &lt;span class="nv"&gt;Fruit&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;Exporter&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;import&lt;/span&gt;&lt;span class="p"&gt;';&lt;/span&gt;
    &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;Types::&lt;/span&gt;&lt;span class="nv"&gt;Common&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;types&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;# kura meets built-in class!&lt;/span&gt;
    &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;kura&lt;/span&gt; &lt;span class="s"&gt;Name&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;StrLength&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="nv"&gt;field&lt;/span&gt; &lt;span class="nv"&gt;$name&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;param&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nv"&gt;ADJUST&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;assert_valid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$fruit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;Fruit&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;'');&lt;/span&gt; &lt;span class="c1"&gt;# Error!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a unique feature of &lt;em&gt;kura&lt;/em&gt;, that isn't possible with &lt;a href="https://metacpan.org/pod/Type::Library" rel="noopener noreferrer"&gt;Type::Library&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Feel free to give it a try!&lt;/p&gt;




&lt;p&gt;This article is for &lt;a href="https://qiita.com/advent-calendar/2024/perl" rel="noopener noreferrer"&gt;Japanese Perl Advent Calendar 2024&lt;/a&gt;&lt;/p&gt;

</description>
      <category>perl</category>
    </item>
    <item>
      <title>Released Result::Simple - a dead simple perl-ish Result like F#, Rust, Go</title>
      <dc:creator>kobaken</dc:creator>
      <pubDate>Sat, 23 Nov 2024 22:43:37 +0000</pubDate>
      <link>https://dev.to/kfly8/released-resultsimple-a-dead-simple-perl-ish-result-like-f-rust-go-2hl2</link>
      <guid>https://dev.to/kfly8/released-resultsimple-a-dead-simple-perl-ish-result-like-f-rust-go-2hl2</guid>
      <description>&lt;p&gt;&lt;a href="https://metacpan.org/pod/Result::Simple" rel="noopener noreferrer"&gt;https://metacpan.org/pod/Result::Simple&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Result::Simple is a dead simple Perl-ish Result.&lt;/p&gt;

&lt;p&gt;Result represents a function's return value as success or failure, enabling safer error handling and more effective control flow management. This pattern is used in other languages such as F#, Rust, and Go.&lt;/p&gt;

&lt;p&gt;In Perl, this pattern is also useful, and this module provides a simple way to use it. This module does not wrap a return value in an object. Just return a tuple like ($data, undef) or (undef, $err). For example, take a look at a implement of Ok function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="c1"&gt;# When the function is successful, it should return this.&lt;/span&gt;
&lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="nf"&gt;Ok&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;CHECK_ENABLED&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;croak&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;`Ok` must be called in list context&lt;/span&gt;&lt;span class="p"&gt;"&lt;/span&gt; &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="nb"&gt;wantarray&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nv"&gt;croak&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;`Ok` does not allow multiple arguments&lt;/span&gt;&lt;span class="p"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nv"&gt;_&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nv"&gt;croak&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;`Ok` does not allow no arguments&lt;/span&gt;&lt;span class="p"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nv"&gt;_&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vg"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nb"&gt;undef&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is a dead simple! &lt;/p&gt;

&lt;p&gt;However, it decreases the bugs. For instance, if you forget to handle $err, it can be detected by &lt;a href="https://metacpan.org/pod/Perl::Critic::Policy::Variables::ProhibitUnusedVarsStricter" rel="noopener noreferrer"&gt;Perl::Critic::Policy::Variables::ProhibitUnusedVarsStricter&lt;/a&gt;. This is one of effectiveness of Result pattern!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvq94oph9xnzspi1znlyk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvq94oph9xnzspi1znlyk.png" alt="Image description" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feel free to give it a try!&lt;/p&gt;

&lt;p&gt;——-&lt;/p&gt;

&lt;p&gt;This blog is for &lt;a href="https://qiita.com/advent-calendar/2024/perl" rel="noopener noreferrer"&gt;Japanese perl advent calendar 2024&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>perl</category>
    </item>
    <item>
      <title>Released 'kura' - Store constraints for Data::Checks, Type::Tiny, Moose and more.</title>
      <dc:creator>kobaken</dc:creator>
      <pubDate>Sun, 18 Aug 2024 14:15:39 +0000</pubDate>
      <link>https://dev.to/kfly8/released-kura-store-constraints-for-datachecks-typetiny-moose-and-more-1o1f</link>
      <guid>https://dev.to/kfly8/released-kura-store-constraints-for-datachecks-typetiny-moose-and-more-1o1f</guid>
      <description>&lt;p&gt;Perl offers several libraries for managing type constraints, such as Data::Checks, Type::Tiny, and Moose. In large projects, you might encounter a mix of different type constraints, reflecting the codebase’s evolution over time. Furthermore, recent Perl versions have introduced projects like &lt;a href="https://github.com/Perl-Apollo/Corinna" rel="noopener noreferrer"&gt;Corinna, which focuses on class features&lt;/a&gt;, and &lt;a href="https://github.com/Perl-Apollo/oshun" rel="noopener noreferrer"&gt;Oshun, which deals with value checking&lt;/a&gt; (with &lt;a href="https://metacpan.org/pod/Data::Checks" rel="noopener noreferrer"&gt;Data::Checks&lt;/a&gt; being a prototype from this project). Given these developments, I believed it would be useful to manage multiple type constraints through a unified interface, simplifying the process of staying up-to-date with Perl’s advancements.&lt;/p&gt;

&lt;p&gt;To address this, I have released &lt;a href="https://metacpan.org/release/KFLY/kura-0.01/view/lib/kura.pm" rel="noopener noreferrer"&gt;Kura&lt;/a&gt;, a tool designed to store and retrieve various type constraints from libraries like Data::Checks, Type::Tiny, and Moose in one central location. “Kura” is the Japanese word for a traditional storehouse.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Data::Checks -----------------&amp;gt; +--------+
                                |        |
Type::Tiny -------------------&amp;gt; |        |
                                |  Kura  | ---&amp;gt; Named Value Constraints!
Moose::Meta::TypeConstraint --&amp;gt; |        |
                                |        |
YourFavoriteConstraint -------&amp;gt; +--------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The following code is synopsis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="nb"&gt;package&lt;/span&gt; &lt;span class="nv"&gt;MyFoo&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;Data::&lt;/span&gt;&lt;span class="nv"&gt;Checks&lt;/span&gt; &lt;span class="sx"&gt;qw(StrEq)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;kura&lt;/span&gt; &lt;span class="s"&gt;Foo&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;StrEq&lt;/span&gt;&lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;');&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nb"&gt;package&lt;/span&gt; &lt;span class="nv"&gt;MyBar&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;Types::&lt;/span&gt;&lt;span class="nv"&gt;Standard&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;types&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;kura&lt;/span&gt; &lt;span class="s"&gt;Bar&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;Str&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="vg"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;eq&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nb"&gt;package&lt;/span&gt; &lt;span class="nv"&gt;MyBaz&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;Moose::Util::&lt;/span&gt;&lt;span class="nv"&gt;TypeConstraints&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;kura&lt;/span&gt; &lt;span class="s"&gt;Baz&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;subtype&lt;/span&gt; &lt;span class="nv"&gt;as&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Str&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;where&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="vg"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;eq&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;baz&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nb"&gt;package&lt;/span&gt; &lt;span class="nv"&gt;MyQux&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;kura&lt;/span&gt; &lt;span class="s"&gt;Qux&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="vg"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;eq&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;qux&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;MyFoo&lt;/span&gt; &lt;span class="sx"&gt;qw(Foo)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;MyBar&lt;/span&gt; &lt;span class="sx"&gt;qw(Bar)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;MyBaz&lt;/span&gt; &lt;span class="sx"&gt;qw(Baz)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;MyQux&lt;/span&gt; &lt;span class="sx"&gt;qw(Qux)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# CodeRef converted to Type::Tiny&lt;/span&gt;

&lt;span class="nv"&gt;ok&lt;/span&gt;  &lt;span class="nv"&gt;Foo&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;check&lt;/span&gt;&lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;')&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;Foo&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;check&lt;/span&gt;&lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;')&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;Foo&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;check&lt;/span&gt;&lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;baz&lt;/span&gt;&lt;span class="p"&gt;')&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;Foo&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;check&lt;/span&gt;&lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;qux&lt;/span&gt;&lt;span class="p"&gt;');&lt;/span&gt;
&lt;span class="nv"&gt;ok&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;Bar&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;check&lt;/span&gt;&lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;')&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;  &lt;span class="nv"&gt;Bar&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;check&lt;/span&gt;&lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;')&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;Bar&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;check&lt;/span&gt;&lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;baz&lt;/span&gt;&lt;span class="p"&gt;')&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;Bar&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;check&lt;/span&gt;&lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;qux&lt;/span&gt;&lt;span class="p"&gt;');&lt;/span&gt;
&lt;span class="nv"&gt;ok&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;Baz&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;check&lt;/span&gt;&lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;')&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;Baz&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;check&lt;/span&gt;&lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;')&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;  &lt;span class="nv"&gt;Baz&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;check&lt;/span&gt;&lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;baz&lt;/span&gt;&lt;span class="p"&gt;')&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;Baz&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;check&lt;/span&gt;&lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;qux&lt;/span&gt;&lt;span class="p"&gt;');&lt;/span&gt;
&lt;span class="nv"&gt;ok&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;Qux&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;check&lt;/span&gt;&lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;')&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;Qux&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;check&lt;/span&gt;&lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;')&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;Qux&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;check&lt;/span&gt;&lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;baz&lt;/span&gt;&lt;span class="p"&gt;')&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;  &lt;span class="nv"&gt;Qux&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;check&lt;/span&gt;&lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;qux&lt;/span&gt;&lt;span class="p"&gt;');&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The following code shows how Kura can be used. If you manually replace &lt;code&gt;use kura&lt;/code&gt; with &lt;code&gt;type&lt;/code&gt;, it should read similarly to type declarations in statically typed languages😁&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="nb"&gt;package&lt;/span&gt; &lt;span class="nv"&gt;MyFoo&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;Types::&lt;/span&gt;&lt;span class="nv"&gt;Standard&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;types&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

   &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;kura&lt;/span&gt; &lt;span class="s"&gt;Name&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;Str&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="sx"&gt;qr/^[A-Z][a-z]+$/&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
   &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;kura&lt;/span&gt; &lt;span class="s"&gt;Level&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;Int&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="vg"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="vg"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

   &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;kura&lt;/span&gt; &lt;span class="s"&gt;Charactor&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;Dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="s"&gt;name&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s"&gt;level&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;Level&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nb"&gt;package&lt;/span&gt; &lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;MyFoo&lt;/span&gt; &lt;span class="sx"&gt;qw(Charactor)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nv"&gt;Charactor&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;check&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="s"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Alice&lt;/span&gt;&lt;span class="p"&gt;',&lt;/span&gt; &lt;span class="s"&gt;level&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Happy Hacking!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://metacpan.org/release/KFLY/kura-0.01/view/lib/kura.pm" rel="noopener noreferrer"&gt;https://metacpan.org/release/KFLY/kura-0.01/view/lib/kura.pm&lt;/a&gt;&lt;/p&gt;

</description>
      <category>perl</category>
    </item>
    <item>
      <title>Released Syntax::Keyword::Assert</title>
      <dc:creator>kobaken</dc:creator>
      <pubDate>Wed, 14 Aug 2024 15:20:27 +0000</pubDate>
      <link>https://dev.to/kfly8/released-syntaxkeywordassert-2df8</link>
      <guid>https://dev.to/kfly8/released-syntaxkeywordassert-2df8</guid>
      <description>&lt;p&gt;&lt;a href="https://metacpan.org/pod/Syntax::Keyword::Assert" rel="noopener noreferrer"&gt;https://metacpan.org/pod/Syntax::Keyword::Assert&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;assert { ... }&lt;/code&gt; syntax allows you to create assertions based on the evaluation of a block. One of the key advantages of using a keyword plugin like this is that it doesn’t degrade performance in production environments where assertions might be unnecessary. This is similar to how assertions work in compiled languages.&lt;/p&gt;

&lt;p&gt;Here’s a simple example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;Syntax::Keyword::&lt;/span&gt;&lt;span class="nv"&gt;Assert&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="nf"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;($name) {&lt;/span&gt;
    &lt;span class="nv"&gt;assert&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;defined&lt;/span&gt; &lt;span class="nv"&gt;$name&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="nv"&gt;say&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello, &lt;/span&gt;&lt;span class="si"&gt;$name&lt;/span&gt;&lt;span class="s2"&gt;!&lt;/span&gt;&lt;span class="p"&gt;";&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;("&lt;/span&gt;&lt;span class="s2"&gt;Alice&lt;/span&gt;&lt;span class="p"&gt;");&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; Hello, Alice!&lt;/span&gt;
&lt;span class="nv"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;        &lt;span class="c1"&gt;# =&amp;gt; Dies when STRICT mode is enabled&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keyword plugins hook into Perl’s parser to extend its syntax. Paul Evans, a Perl developer, has been making extensive use of this feature. Instead of directly modifying Perl’s core, he prototypes new features using keyword plugins, gathers feedback from the community, and then works towards incorporating them into Perl itself. Recent syntax extensions like try/catch, defer, and class are results of this approach. (a remarkable achievement!).&lt;/p&gt;

&lt;p&gt;Examples of Modules Using Keyword Plugins:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://metacpan.org/pod/Syntax::Keyword::Try" rel="noopener noreferrer"&gt;Syntax::Keyword::Try&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://metacpan.org/pod/Syntax::Keyword::Defer" rel="noopener noreferrer"&gt;Syntax::Keyword::Defer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://metacpan.org/pod/Syntax::Operator::Equ" rel="noopener noreferrer"&gt;Syntax::Operator::Equ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://metacpan.org/pod/Syntax::Operator::Is" rel="noopener noreferrer"&gt;Syntax::Operator::Is&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://metacpan.org/pod/Object::Pad" rel="noopener noreferrer"&gt;Object::Pad&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How Do Keyword Plugins Work?
&lt;/h2&gt;

&lt;p&gt;Here’s a general idea of how keyword plugins function:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The parser detects the specified keyword (in this case, &lt;code&gt;assert&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;It inserts the desired OP tree (similar to an abstract syntax tree) around the keyword. That's it!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For instance, in the case of &lt;code&gt;Syntax::Keyword::Assert&lt;/code&gt;, the code &lt;code&gt;assert { defined $name }&lt;/code&gt; gets transformed into an OP tree equivalent to the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="c1"&gt;# When STRICT mode is enabled&lt;/span&gt;
&lt;span class="nv"&gt;croak&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Assertion failed&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt; &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;defined&lt;/span&gt; &lt;span class="nv"&gt;$name&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;# When STRICT mode is disabled, do nothing.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For those interested in the source code, here’s how it works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/kfly8/Syntax-Keyword-Assert/blob/1752a71a833437933e22853336a425bb724a8800/lib/Syntax/Keyword/Assert.xs#L64-L74" rel="noopener noreferrer"&gt;Register a hook so the parser can react to the specified keyword&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/kfly8/Syntax-Keyword-Assert/blob/1752a71a833437933e22853336a425bb724a8800/lib/Syntax/Keyword/Assert.xs#L40-L62" rel="noopener noreferrer"&gt;Construct the desired OP tree&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pretty interesting, right?&lt;/p&gt;




&lt;h2&gt;
  
  
  Development Notes
&lt;/h2&gt;

&lt;p&gt;As a side note, I wasn’t initially familiar with constructing OP trees, so I’ll document my process here for future reference.&lt;/p&gt;

&lt;p&gt;Here’s the general workflow I followed:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;First, write the content you want to replace with a keyword in pure Perl. For this example, it’s &lt;code&gt;croak ... unless BLOCK&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Use tools like &lt;code&gt;B::Terse&lt;/code&gt; and &lt;code&gt;B::Debug&lt;/code&gt; to understand the resulting OP tree.&lt;/li&gt;
&lt;li&gt;Verify that the OP tree you’ve written matches the one from the original code.&lt;/li&gt;
&lt;li&gt;Additionally, check the output with &lt;code&gt;B::Deparse&lt;/code&gt; to ensure it matches your expectations.&lt;/li&gt;
&lt;li&gt;Iterate until you get the desired results.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I also found the following resources helpful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The source code of other modules that use keyword plugins.

&lt;ul&gt;
&lt;li&gt;Since this syntax involves &lt;code&gt;KEYWORD BLOCK&lt;/code&gt;, it’s essentially the same as &lt;code&gt;Syntax::Keyword::Defer&lt;/code&gt;, apart from the OP tree construction.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Reading &lt;code&gt;perlapi&lt;/code&gt; and examining core Perl files like &lt;code&gt;op.c&lt;/code&gt; and &lt;code&gt;opnames.h&lt;/code&gt; made it easier to understand OP tree construction.

&lt;ul&gt;
&lt;li&gt;If you’re unclear on terms like SV or OP, I recommend reading this article by tokuhirom: &lt;a href="https://xsubtut.github.io/" rel="noopener noreferrer"&gt;https://xsubtut.github.io/&lt;/a&gt; (jp).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;I also frequently used &lt;code&gt;Yet Another CPAN Grep&lt;/code&gt; to search for relevant code.

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://grep.cpanauthors.org/search" rel="noopener noreferrer"&gt;https://grep.cpanauthors.org/search&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;That’s all for now!&lt;br&gt;&lt;br&gt;
Happy Hacking!&lt;/p&gt;

</description>
      <category>perl</category>
    </item>
    <item>
      <title>Benchmarked new perl class feature with many class builders[2025-10-30 updated]</title>
      <dc:creator>kobaken</dc:creator>
      <pubDate>Sat, 12 Aug 2023 07:57:04 +0000</pubDate>
      <link>https://dev.to/kfly8/benchmarked-new-perl-class-feature-with-many-class-builders-17n</link>
      <guid>https://dev.to/kfly8/benchmarked-new-perl-class-feature-with-many-class-builders-17n</guid>
      <description>&lt;h2&gt;
  
  
  [Updated]
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;(2025-10-30 0:13 JST) update to v5.42 benchmarked &amp;amp; &lt;a href="https://github.com/kfly8/bench-perl-class-builder/pulls?q=is%3Apr+is%3Aclosed" rel="noopener noreferrer"&gt;optimize Classical Core Class Implementations #10&lt;/a&gt; (Thanks @bodo-hugo-barwich )&lt;/li&gt;
&lt;li&gt;(2024-06-10 11:13 JST) update to v5.40 benchmarked result &lt;a href="https://github.com/kfly8/bench-perl-class-builder/tree/v5.40" rel="noopener noreferrer"&gt;GitHub - kfly8/bench-perl-class-builder at v5.40&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;(2023-08-22 21:30 JST) Added the following pull requests, then benchmarked. Thanks &lt;a class="mentioned-user" href="https://dev.to/bbrtj"&gt;@bbrtj&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kfly8/bench-perl-class-builder/pull/4" rel="noopener noreferrer"&gt;Add XS variants for Moose and Moo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;(2023-08-22 15:30 JST) Added the following pull requests, then benchmarked. Thanks &lt;a class="mentioned-user" href="https://dev.to/bbrtj"&gt;@bbrtj&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kfly8/bench-perl-class-builder/pull/1" rel="noopener noreferrer"&gt;Add immutable for Moose class #1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kfly8/bench-perl-class-builder/pull/2" rel="noopener noreferrer"&gt;Add two extra fields for each class #2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's this?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://metacpan.org/release/RJBS/perl-5.38.0/view/pod/perldelta.pod" rel="noopener noreferrer"&gt;In Perl 5.38, the class feature was integrated into the core&lt;/a&gt;, so I compared it with many class builders. Ovid, who is main designer of new class feature, blogged the follwing thing:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note that it’s not taking anything away from Perl; it’s adding a core object system for better memory consumption, performance, and elegance.&lt;br&gt;
( &lt;a href="https://ovid.github.io/articles/corinna-in-the-perl-core.html" rel="noopener noreferrer"&gt;https://ovid.github.io/articles/corinna-in-the-perl-core.html&lt;/a&gt; )&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The summary is as follows. Note that this class syntax is still experimental, so results may vary depending on future development.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;As of v5.38 [&lt;a href="https://github.com/kfly8/bench-perl-class-builder/tree/v5.38:title" rel="noopener noreferrer"&gt;https://github.com/kfly8/bench-perl-class-builder/tree/v5.38:title&lt;/a&gt;]

&lt;ul&gt;
&lt;li&gt;This new class syntax was the most memory efficient, and the performance of constructors and object accessors was comparable to that of the array references with bles. (Performance was better than bless with the most used hash reference.)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;For v5.40 [&lt;a href="https://github.com/kfly8/bench-perl-class-builder/tree/v5.40:title" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://github.com/kfly8/bench-perl-class-builder/tree/v5.40:title" rel="noopener noreferrer"&gt;https://github.com/kfly8/bench-perl-class-builder/tree/v5.40:title&lt;/a&gt;]

&lt;ul&gt;
&lt;li&gt;This new class syntax was the most memory efficient.&lt;/li&gt;
&lt;li&gt;The constructor had performance comparable to that of the array reference blessed.&lt;/li&gt;
&lt;li&gt;The object accessors performed as well as a hash reference without.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Execution Environment
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;*&lt;/span&gt; Operating System:
&lt;span class="nv"&gt;PRETTY_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Debian GNU/Linux 13 (trixie)"&lt;/span&gt;
&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Debian GNU/Linux"&lt;/span&gt;
&lt;span class="nv"&gt;VERSION_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"13"&lt;/span&gt;
&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"13 (trixie)"&lt;/span&gt;
&lt;span class="nv"&gt;VERSION_CODENAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;trixie
&lt;span class="nv"&gt;DEBIAN_VERSION_FULL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;13.1
&lt;span class="nt"&gt;--&lt;/span&gt; https://github.com/kfly8/bench-perl-class-builder/blob/1549f173d9b93c252d73019079b0feb7620bfa84/.github/workflows/benchmark-debian-trixie.yml#L23-L28
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Benchmark memory size
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Size&lt;/th&gt;
&lt;th&gt;Compare&lt;/th&gt;
&lt;th&gt;Title&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;163.1 KB&lt;/td&gt;
&lt;td&gt;--&lt;/td&gt;
&lt;td&gt;&lt;code&gt;class feature (perl: 5.042000)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;257.9 KB&lt;/td&gt;
&lt;td&gt;58.10%&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bless arrayref&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;265.7 KB&lt;/td&gt;
&lt;td&gt;62.90%&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Object::Pad@0.821&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;359.5 KB&lt;/td&gt;
&lt;td&gt;120.40%&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Moose@2.4000 (XSAccessor)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;359.5 KB&lt;/td&gt;
&lt;td&gt;120.40%&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Moo@2.005005 (XSConstructor + XSAccessor)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;359.5 KB&lt;/td&gt;
&lt;td&gt;120.40%&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Class::Tiny@1.008&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;359.5 KB&lt;/td&gt;
&lt;td&gt;120.40%&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Class::Accessor::Lite@0.08&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;359.5 KB&lt;/td&gt;
&lt;td&gt;120.40%&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Moose@2.4000&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;359.5 KB&lt;/td&gt;
&lt;td&gt;120.40%&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Object::Tiny@1.09&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;359.5 KB&lt;/td&gt;
&lt;td&gt;120.40%&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Moo@2.005005&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;359.5 KB&lt;/td&gt;
&lt;td&gt;120.40%&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Mouse@v2.5.11&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;359.5 KB&lt;/td&gt;
&lt;td&gt;120.40%&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bless hashref&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This result were calculated using &lt;a href="https://github.com/kfly8/bench-perl-class-builder/blob/main/bench-size.pl" rel="noopener noreferrer"&gt;bench-size.pl&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benchmark object constructors
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rate&lt;/th&gt;
&lt;th&gt;Compare&lt;/th&gt;
&lt;th&gt;Title&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;301/s&lt;/td&gt;
&lt;td&gt;-65%&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Class::Tiny@1.008&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;431/s&lt;/td&gt;
&lt;td&gt;-50%&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Moose@2.4000 (XSAccessor)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;432/s&lt;/td&gt;
&lt;td&gt;-50%&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Moose@2.4000&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;550/s&lt;/td&gt;
&lt;td&gt;-36%&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Moo@2.005005&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;550/s&lt;/td&gt;
&lt;td&gt;-36%&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Moo@2.005005 (XSConstructor + XSAccessor)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;627/s&lt;/td&gt;
&lt;td&gt;-27%&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Mouse@v2.5.11&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;684/s&lt;/td&gt;
&lt;td&gt;-20%&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Object::Pad@0.821&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;760/s&lt;/td&gt;
&lt;td&gt;-12%&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bless arrayref&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;861/s&lt;/td&gt;
&lt;td&gt;--&lt;/td&gt;
&lt;td&gt;&lt;code&gt;class feature (perl: 5.042000)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1028/s&lt;/td&gt;
&lt;td&gt;19%&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bless hashref&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1046/s&lt;/td&gt;
&lt;td&gt;22%&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Class::Accessor::Lite@0.08&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1090/s&lt;/td&gt;
&lt;td&gt;27%&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Object::Tiny@1.09&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This result were calculated using &lt;a href="https://github.com/kfly8/bench-perl-class-builder/blob/main/bench-new.pl" rel="noopener noreferrer"&gt;bench-new.pl&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benchmark access to object fields
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rate&lt;/th&gt;
&lt;th&gt;Compare&lt;/th&gt;
&lt;th&gt;Title&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;24093/s&lt;/td&gt;
&lt;td&gt;-26%&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Object::Pad@0.821&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;29538/s&lt;/td&gt;
&lt;td&gt;-9%&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Class::Accessor::Lite@0.08&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;31210/s&lt;/td&gt;
&lt;td&gt;-4%&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Moose@2.4000&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;32581/s&lt;/td&gt;
&lt;td&gt;--&lt;/td&gt;
&lt;td&gt;&lt;code&gt;class feature (perl: 5.042000)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;33998/s&lt;/td&gt;
&lt;td&gt;4%&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Class::Tiny@1.008&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;34600/s&lt;/td&gt;
&lt;td&gt;6%&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Moo@2.005005&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;41155/s&lt;/td&gt;
&lt;td&gt;26%&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bless hashref&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;42708/s&lt;/td&gt;
&lt;td&gt;31%&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bless arrayref&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;44246/s&lt;/td&gt;
&lt;td&gt;36%&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Object::Tiny@1.09&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;55137/s&lt;/td&gt;
&lt;td&gt;69%&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Moose@2.4000 (XSAccessor)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;59077/s&lt;/td&gt;
&lt;td&gt;81%&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Mouse@v2.5.11&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;71739/s&lt;/td&gt;
&lt;td&gt;120%&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Moo@2.005005 (XSConstructor + XSAccessor)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This result were calculated using &lt;a href="https://github.com/kfly8/bench-perl-class-builder/blob/main/bench-field.pl" rel="noopener noreferrer"&gt;bench-field.pl&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Repository
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/kfly8/bench-perl-class-builder" rel="noopener noreferrer"&gt;https://github.com/kfly8/bench-perl-class-builder&lt;/a&gt;&lt;/p&gt;

</description>
      <category>perl</category>
    </item>
    <item>
      <title>Released types for subroutines</title>
      <dc:creator>kobaken</dc:creator>
      <pubDate>Sat, 18 Sep 2021 14:14:25 +0000</pubDate>
      <link>https://dev.to/kfly8/released-types-sub-which-are-types-for-subroutines-58d1</link>
      <guid>https://dev.to/kfly8/released-types-sub-which-are-types-for-subroutines-58d1</guid>
      <description>&lt;p&gt;It is useful to have a subroutine type, so I made one.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;Types::&lt;/span&gt;&lt;span class="nv"&gt;Sub&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;types&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;Types::&lt;/span&gt;&lt;span class="nv"&gt;Standard&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;types&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$Sub&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;Sub&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s"&gt;args&lt;/span&gt;    &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s"&gt;returns&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="nb"&gt;warn&lt;/span&gt; &lt;span class="nv"&gt;$Sub&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="p"&gt;{})&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;# Reference sub { "DUMMY" } did not pass type constraint "Sub[sub(Int, Int) =&amp;gt; Int]"&lt;/span&gt;
&lt;span class="c1"&gt;#    Reason : invalid parameters: invalid args length. got: 0, expected: 2&lt;/span&gt;
&lt;span class="c1"&gt;#    Expected : sub(Int, Int) =&amp;gt; Int&lt;/span&gt;
&lt;span class="c1"&gt;#    Got      : sub(*) =&amp;gt; *&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you can find the meta-information from the subroutine, the test will pass as follows.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;Types::&lt;/span&gt;&lt;span class="nv"&gt;Sub&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;types&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;Types::&lt;/span&gt;&lt;span class="nv"&gt;Standard&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;types&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$Sub&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;Sub&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;Function::&lt;/span&gt;&lt;span class="nv"&gt;Parameters&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="nv"&gt;fun&lt;/span&gt; &lt;span class="nv"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Int&lt;/span&gt; &lt;span class="nv"&gt;$a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Int&lt;/span&gt; &lt;span class="nv"&gt;$b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;$b&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nv"&gt;ok&lt;/span&gt; &lt;span class="nv"&gt;$Sub&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="nv"&gt;&amp;amp;add&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;Sub::&lt;/span&gt;&lt;span class="nv"&gt;WrapInType&lt;/span&gt; &lt;span class="sx"&gt;qw(wrap_sub)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;ok&lt;/span&gt; &lt;span class="nv"&gt;$Sub&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;wrap_sub&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nv"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="p"&gt;{}));&lt;/span&gt;

&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;Sub::WrapInType::&lt;/span&gt;&lt;span class="nv"&gt;Attribute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="nf"&gt;add2&lt;/span&gt; &lt;span class="p"&gt;:WrapSub([Int,Int] =&amp;gt; Int) {&lt;/span&gt;
    &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;$b&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nv"&gt;ok&lt;/span&gt; &lt;span class="nv"&gt;$Sub&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="nv"&gt;&amp;amp;add2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="nf"&gt;add3&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$meta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Sub::&lt;/span&gt;&lt;span class="nv"&gt;Meta&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;args&lt;/span&gt;    &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s"&gt;returns&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nn"&gt;Sub::Meta::&lt;/span&gt;&lt;span class="nv"&gt;Library&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="nv"&gt;&amp;amp;add3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$meta&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;ok&lt;/span&gt; &lt;span class="nv"&gt;$Sub&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="nv"&gt;&amp;amp;add3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Internally, &lt;code&gt;Sub[...]&lt;/code&gt; coerces subroutines into Sub::Meta and compares Sub::Meta against each other.&lt;/p&gt;

&lt;p&gt;Give it a try!&lt;br&gt;
&lt;a href="https://metacpan.org/release/KFLY/Sub-Meta-0.14/view/lib/Types/Sub.pm"&gt;https://metacpan.org/release/KFLY/Sub-Meta-0.14/view/lib/Types/Sub.pm&lt;/a&gt;&lt;/p&gt;

</description>
      <category>perl</category>
      <category>perl5</category>
    </item>
    <item>
      <title>Tools for learning Perl context</title>
      <dc:creator>kobaken</dc:creator>
      <pubDate>Mon, 10 May 2021 12:41:40 +0000</pubDate>
      <link>https://dev.to/kfly8/tools-for-learning-perl-context-5ej3</link>
      <guid>https://dev.to/kfly8/tools-for-learning-perl-context-5ej3</guid>
      <description>&lt;p&gt;There are times when I am confused by the context of Perl. I wrote a tool to reduce this confusion.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/kfly8"&gt;
        kfly8
      &lt;/a&gt; / &lt;a href="https://github.com/kfly8/p5-Contextual-Diag"&gt;
        p5-Contextual-Diag
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      diagnose contexts
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h1&gt;
  
  
  Usage
&lt;/h1&gt;

&lt;p&gt;If you plug in the &lt;code&gt;contextual_diag&lt;/code&gt; subroutine where you want to know Perl context, it will alert you to the context. &lt;/p&gt;

&lt;p&gt;The following code explores the context when evaluating the value of a hash reference:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;Contextual::&lt;/span&gt;&lt;span class="nv"&gt;Diag&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;# Here...&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;value&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;# Do this...&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;contextual_diag&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;value&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;# Then this happens!&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; wanted LIST context&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Inside Contextual::Diag
&lt;/h1&gt;

&lt;p&gt;In Contextual::Diag, the first step is to use &lt;code&gt;wantarray&lt;/code&gt; to separate contexts into SCALAR, LIST, and VOID. Then, in the case of SCALAR context, the return value is wrapped in an object, and overload is used to hook into string evaluation, numeric evaluation, and array dereferencing. Only in the case of object reference, overload is not enough to hook, so AUTOLOAD is used. I got this idea from Professor Damian's Contextual::Return.&lt;/p&gt;

&lt;h1&gt;
  
  
  List of diagnoses
&lt;/h1&gt;

&lt;p&gt;Contextual::Diag has a total of 11 different diagnoses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. SCALAR context
   - CASE: Scalar value
      - BOOL e.g. `if ($value)`
      - NUM e.g. `$value + 1`
      - STR e.g. `$value . "hello"`
   - CASE:  Scalar reference
      - SCALARREF e.g. `$$value`
      - ARRAYREF e.g. `$value-&amp;gt;[0]`
      - HASHREF e.g. `$value-&amp;gt;{key}`
      - CODEREF e.g. `$value-&amp;gt;()`
      - GLOBREF e.g. `*{$value}-&amp;gt;{CODE}`
      - OBJREF e.g. `$value-&amp;gt;hello()`
2. LIST context
3. VOID context
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;I wrote Contextual::Diag to make it easier to understand Perl context.&lt;/p&gt;

&lt;p&gt;You can use it if you like!&lt;/p&gt;

</description>
      <category>perl</category>
    </item>
    <item>
      <title>Released Sub::Meta that handles function meta information in Perl 5</title>
      <dc:creator>kobaken</dc:creator>
      <pubDate>Tue, 09 Jul 2019 14:05:28 +0000</pubDate>
      <link>https://dev.to/kfly8/released-sub-meta-that-handles-function-meta-information-in-perl-5-206o</link>
      <guid>https://dev.to/kfly8/released-sub-meta-that-handles-function-meta-information-in-perl-5-206o</guid>
      <description>&lt;p&gt;&lt;a href="https://metacpan.org/pod/Sub::Meta"&gt;Sub::Meta - handle subroutine meta information - metacpan.org&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Sub::Meta&lt;/code&gt; is a module to handle meta information such as subroutine names and subroutine input/output.&lt;br&gt;
There are similar modules such as &lt;code&gt;Sub::Identify&lt;/code&gt;,&lt;code&gt;Sub::Util&lt;/code&gt; and &lt;code&gt;Sub::Info&lt;/code&gt;, but write&lt;code&gt;Sub::Meta&lt;/code&gt; because it can not handle the meta information of the input/output of the subroutine.&lt;/p&gt;

&lt;p&gt;The basic usage is as follows.&lt;br&gt;
You can get meta information based on the code reference:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;Sub::&lt;/span&gt;&lt;span class="nv"&gt;Meta&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="nf"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;($)&lt;/span&gt; &lt;span class="p"&gt;:mehtod {&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$meta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Sub::&lt;/span&gt;&lt;span class="nv"&gt;Meta&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;sub&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="nv"&gt;&amp;amp;hello&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$meta&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;subname&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;     &lt;span class="c1"&gt;# hello&lt;/span&gt;
&lt;span class="nv"&gt;$meta&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;         &lt;span class="c1"&gt;# \&amp;amp;hello&lt;/span&gt;
&lt;span class="nv"&gt;$meta&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;subname&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;     &lt;span class="c1"&gt;# hello&lt;/span&gt;
&lt;span class="nv"&gt;$meta&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;fullname&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;    &lt;span class="c1"&gt;# main::hello&lt;/span&gt;
&lt;span class="nv"&gt;$meta&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;stashname&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;# main&lt;/span&gt;
&lt;span class="nv"&gt;$meta&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;file&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;        &lt;span class="c1"&gt;# path/to/file.pl&lt;/span&gt;
&lt;span class="nv"&gt;$meta&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;line&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;        &lt;span class="c1"&gt;# 5&lt;/span&gt;
&lt;span class="nv"&gt;$meta&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;is_constant&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# !!0&lt;/span&gt;
&lt;span class="nv"&gt;$meta&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;# $&lt;/span&gt;
&lt;span class="nv"&gt;$meta&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;attribute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;# ['method']&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also handle meta information without passing a code reference:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$meta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Sub::&lt;/span&gt;&lt;span class="nv"&gt;Meta&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;subname&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;');&lt;/span&gt;
&lt;span class="nv"&gt;$meta&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;subname&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# foo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Function input/output meta information can be added:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="c1"&gt;# INPUT&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$parameters&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Sub::Meta::&lt;/span&gt;&lt;span class="nv"&gt;Parameters&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="s"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$a&lt;/span&gt;&lt;span class="p"&gt;',&lt;/span&gt; &lt;span class="s"&gt;type&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$b&lt;/span&gt;&lt;span class="p"&gt;',&lt;/span&gt; &lt;span class="s"&gt;type&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;'},&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="s"&gt;nshift&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nv"&gt;$meta&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;set_parameters&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$paramters&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$meta&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;parameters&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;args&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;# [&lt;/span&gt;
&lt;span class="c1"&gt;# Sub::Meta::Param-&amp;gt;new({ name =&amp;gt; '$a', type =&amp;gt; 'Int' }),&lt;/span&gt;
&lt;span class="c1"&gt;# Sub::Meta::Param-&amp;gt;new({ name =&amp;gt; '$b', type =&amp;gt; 'Int' })&lt;/span&gt;
&lt;span class="c1"&gt;# ]&lt;/span&gt;

&lt;span class="c1"&gt;# OUTPUT&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$returns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Sub::Meta::&lt;/span&gt;&lt;span class="nv"&gt;Returns&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="s"&gt;scalar&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;',&lt;/span&gt;
  &lt;span class="s"&gt;list&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;',&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$meta&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;set_returns&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$returns&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$meta&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;returns&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;scalar&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# 'Int'&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's dig into the motivations for working with function input and output meta information.&lt;/p&gt;

&lt;p&gt;Perl5 has many modules that validate function input, such as &lt;code&gt;Params::Validate&lt;/code&gt;,&lt;code&gt;Data::Validator&lt;/code&gt;, &lt;code&gt;Smart::Args&lt;/code&gt;,&lt;code&gt;Function::Parameters&lt;/code&gt;, &lt;code&gt;Type::Params&lt;/code&gt;, etc.&lt;/p&gt;

&lt;p&gt;Each module has different usability, I thought it was somewhat stressful.&lt;br&gt;
Also, I wanted to do Static analysis because I was annotating the types.&lt;/p&gt;

&lt;p&gt;Therefore, I thought that if there is an object that handles meta information of the input of the function, it will be easier to handle in a unified I/F.&lt;/p&gt;

&lt;p&gt;The same is true for function output.&lt;/p&gt;

&lt;p&gt;Also, when trying to express a Java-like Interface in Perl5 such as &lt;code&gt;Function::Interface&lt;/code&gt;, it is useful if the input/output of functions is easy to handle. &lt;/p&gt;

&lt;p&gt;The current &lt;code&gt;F::I&lt;/code&gt; is sticky in the &lt;code&gt;Function::Parameters&lt;/code&gt; and &lt;code&gt;Function::Return&lt;/code&gt; implementations, and I thought that it could not handle many applications and lacked flexibility.&lt;/p&gt;

&lt;p&gt;That's why I created &lt;code&gt;Sub::Meta&lt;/code&gt; that can handle meta information including function input and output. I'm glad to try it if it is good! That's all!&lt;/p&gt;

</description>
      <category>perl</category>
      <category>perl5</category>
    </item>
    <item>
      <title>Release: Function::Interface</title>
      <dc:creator>kobaken</dc:creator>
      <pubDate>Thu, 21 Mar 2019 11:46:43 +0000</pubDate>
      <link>https://dev.to/kfly8/release-functioninterface-2pp2</link>
      <guid>https://dev.to/kfly8/release-functioninterface-2pp2</guid>
      <description>&lt;p&gt;I'm developing &lt;a href="https://github.com/kfly8/p5-Function-Interface"&gt;Function::Interface&lt;/a&gt;, this module provides a typed interface like Java interface.&lt;br&gt;
&lt;strong&gt;At compile time&lt;/strong&gt;, check if the abstract functions are implemented.&lt;/p&gt;

&lt;p&gt;You can see the demo in the following capture:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://asciinema.org/a/235220"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RRHLv7dY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://asciinema.org/a/235220.svg" alt="asciicast" width="481" height="608"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  USAGE
&lt;/h1&gt;

&lt;p&gt;Declare typed interface package IFoo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="nb"&gt;package&lt;/span&gt; &lt;span class="nv"&gt;IFoo&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;Function::&lt;/span&gt;&lt;span class="nv"&gt;Interface&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;Types::&lt;/span&gt;&lt;span class="nv"&gt;Standard&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;types&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nv"&gt;fun&lt;/span&gt; &lt;span class="nv"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Str&lt;/span&gt; &lt;span class="nv"&gt;$msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;Return&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Str&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nv"&gt;fun&lt;/span&gt; &lt;span class="nv"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Int&lt;/span&gt; &lt;span class="nv"&gt;$a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Int&lt;/span&gt; &lt;span class="nv"&gt;$b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;Return&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Implements the interface package IFoo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="nb"&gt;package&lt;/span&gt; &lt;span class="nv"&gt;Foo&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;Function::Interface::&lt;/span&gt;&lt;span class="nv"&gt;Impl&lt;/span&gt; &lt;span class="sx"&gt;qw(IFoo)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;Types::&lt;/span&gt;&lt;span class="nv"&gt;Standard&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;types&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nv"&gt;fun&lt;/span&gt; &lt;span class="nv"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Str&lt;/span&gt; &lt;span class="nv"&gt;$msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;Return&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;HELLO &lt;/span&gt;&lt;span class="si"&gt;$msg&lt;/span&gt;&lt;span class="p"&gt;";&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nv"&gt;fun&lt;/span&gt; &lt;span class="nv"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Int&lt;/span&gt; &lt;span class="nv"&gt;$a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Int&lt;/span&gt; &lt;span class="nv"&gt;$b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;Return&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;$b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is good not to depend on the implementation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="nb"&gt;package&lt;/span&gt; &lt;span class="nv"&gt;FooService&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;Function::Interface::&lt;/span&gt;&lt;span class="nv"&gt;Types&lt;/span&gt; &lt;span class="sx"&gt;qw(ImplOf)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;Function::&lt;/span&gt;&lt;span class="nv"&gt;Parameters&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;Function::&lt;/span&gt;&lt;span class="nv"&gt;Return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;Mouse&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;aliased&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;IFoo&lt;/span&gt;&lt;span class="p"&gt;';&lt;/span&gt;

    &lt;span class="nv"&gt;fun&lt;/span&gt; &lt;span class="nv"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;ImplOf&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;IFoo&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nv"&gt;$foo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;Return&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="nv"&gt;$foo&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$foo_service&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;FooService&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$foo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;Foo&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# implements of IFoo&lt;/span&gt;

&lt;span class="nv"&gt;$foo_service&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$foo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  How it works
&lt;/h1&gt;

&lt;p&gt;To explain briefly&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;The keywords &lt;code&gt;fun&lt;/code&gt; and&lt;code&gt;method&lt;/code&gt; for declaring abstract functions are implemented in &lt;a href="https://metacpan.org/pod/Keyword%3A%3ASimple"&gt;Keyword::Simple&lt;/a&gt; and &lt;a href="https://metacpan.org/pod/PPR"&gt;PPR&lt;/a&gt;. &lt;a href="https://metacpan.org/pod/B%3A%3ADeparse"&gt;B::Deparse&lt;/a&gt; shows that it stores meta information of abstract functions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In order to check whether the interface is correctly implemented, the stored interface meta information is compared with the implementation meta information that can be obtained using &lt;a href="https://metacpan.org/pod/Function%3A%3AParameters"&gt;Function::Parameters&lt;/a&gt; and &lt;a href="https://metacpan.org/pod/Function%3A%3AReturn"&gt;Function::Return&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Finally
&lt;/h1&gt;

&lt;p&gt;Have you ever experienced the software becoming bigger and less maintenance? In such a case, I think it is important to divide the code, make it easy to change, and make code easier to read.&lt;/p&gt;

&lt;p&gt;In order to divide the code, I think the interface is useful.&lt;br&gt;
Please try it!!&lt;/p&gt;

&lt;p&gt;Thanks.&lt;/p&gt;

</description>
      <category>perl</category>
    </item>
  </channel>
</rss>
