プラグイン書き書き

package Tangerine::Plugin::Evangeline::Image;

use strict;
use warnings;
use version; our $VERSION = qv('0.1.0');

use Class::InsideOut qw/private register id/;
use Image::Magick;

use Tangerine::Core::Carp qw/croak/;

private _im => my %_im;
private _file => my %_file;

sub new {
    my $self = register shift;
    my %arg = @_;
    $_file{id $self} = $arg{file};
    $_im{id $self} = Image::Magick->new or croak "constract: $!";
    my $err = $_im{id $self}->Read($arg{file});
    croak $err if $err;
    return $self;
}

sub get {
    my $self = shift;
    my @attrs = @_;
    return $_im{id $self}->Get(@attrs) or croak $!;
}

sub thumbnail {
    my $self = shift;
    my %args = @_;
    my $thumb= $self->_clone;
    $args{width} && $args{height} or croak;
    my $err = $_im{id $thumb}->Resize(geometry => "$args{width}x$args{height}");
    croak $err if $err;
    return $thumb;
}

sub _clone {
    my $self = shift;
    my $class = ref $self or croak "can't call as class method";
    my $clone = register $class;
    $_im{id $clone} = $_im{id $self}->Clone;
    $_file{id $clone} = $_file{id $self};
    return $clone;
}

sub write {
    my $self = shift;
    my %args = @_;
    my $out = $args{file};
    ($out = $_file{id $self}) =~ s/\.\w+$/.thumb.jpg/ unless $out;
    my $err = $_im{id $self}->Write($out);
    croak $err if $err;
    return 1;
}

1;

クローン作成なんて始めて書いた。といってもほとんどやってることもないけど。