NAME

Evo::Class::Out

VERSION

version 0.0216

DESCRIPTION

Inside-out driver for Evo::Class using Hash::Util::FieldHash. Makes possible to use any type of references as objects.

SYNOPSYS

package main;
use Evo;

{

  package My::Spy;
  use Evo '-Class::Out *';

  has 'foo', required => 1;
}

my $foo = My::Spy->init(sub { say "foo" }, foo => 'FOO');
say $foo->foo;
$foo->();

FEATURES

Evo::Class::Out supports the same features as Evo::Class::Hash, but is a little (20-30%, maybe twice), slower. But allow to use any references, that can be blessed, as objects

init

Instead of new, it provides init. So you can desing new, for example, as a clousure by yourself

EXAMPLE

In this example we created spy object, that logs all invocations. You can make the similar thing with overloading with the hash-class too, but this implementation has one advantage: it's a real codered and reftype returns CODE, not HASH.

package main;
use Evo;
use Scalar::Util 'reftype';

{

  package My::Spy;
  use Evo '-Class::Out *';
  use Scalar::Util 'weaken';

  has calls => sub { [] };
  has 'fn', required => 1;

  sub new {
    my $copy;
    $copy = my $sub = sub { push $copy->calls->@*, [@_]; $copy->fn->(@_); };
    weaken $copy;
    init($sub, @_);
    $sub;
  }
}

my $spy = My::Spy->new(fn => sub { local $, = ';'; say "hello", @_ });
say reftype $spy;

$spy->();
$spy->(1);
$spy->(1, 2);

local $, = '';
say "logged: ", $_->@* for $spy->calls->@*;

AUTHOR

alexbyk.com

COPYRIGHT AND LICENSE

This software is copyright (c) 2016 by alexbyk.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.