File: dynamic_methods.t

package info (click to toggle)
libmojolicious-perl 8.12%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 3,720 kB
  • sloc: perl: 12,099; makefile: 14
file content (45 lines) | stat: -rw-r--r-- 1,268 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
use Mojo::Base -strict;

use Test::More;

package Mojo::TestDynamic;
use Mojo::Base -base;

use Mojo::DynamicMethods -dispatch;

has hashref => sub { {} };

sub BUILD_DYNAMIC {
  my ($class, $method, $dyn_methods) = @_;

  return sub {
    my $self    = shift;
    my $dynamic = $dyn_methods->{$self->hashref}{$method};
    return $self->$dynamic($dyn_methods) if $dynamic;
    my $package = ref $self;
    Carp::croak qq{Can't locate object method "$method" via package "$package"};
  };
}

package main;

# Basics
my ($t1, $t2) = (Mojo::TestDynamic->new, Mojo::TestDynamic->new);
Mojo::DynamicMethods::register 'Mojo::TestDynamic', $t1->hashref, 'foo',
  sub { };
my $foo = \&Mojo::TestDynamic::_Dynamic::foo;
my ($called_foo, $dyn_methods);
Mojo::DynamicMethods::register 'Mojo::TestDynamic', $t1->hashref, 'foo',
  sub { $called_foo++; $dyn_methods = $_[1] };
is $foo, \&Mojo::TestDynamic::_Dynamic::foo, 'foo not reinstalled';
ok !Mojo::TestDynamic->can('foo'), 'dynamic method is hidden';
ok eval { $t1->foo; 1 }, 'foo called ok';
cmp_ok $called_foo, '==', 1, 'called dynamic method';
ok !eval { $t2->foo; 1 }, 'error calling foo on wrong object';

# Garbage collection
undef($t1);
undef($t2);
ok(!keys(%$dyn_methods), 'dynamic methods expired');

done_testing;