CairoX-Sweet

 view release on metacpan or  search on metacpan

lib/Types/CairoX/Sweet.pm  view on Meta::CPAN

use 5.10.0;
use strict;
use warnings;

package Types::CairoX::Sweet;

our $AUTHORITY = 'cpan:CSSON'; # AUTHORITY
our $VERSION = '0.0200';

use Type::Library -base,
                  -declare => qw/
                        CairoImageSurface
                        CairoContext
                        ArrayRefNumOfTwo
                        ArrayRefNumOfFour
                        ArrayRefNumOfSix
                        Color
                        CurveTo
                        LineTo
                        MoveTo
                        NumUpToOne
                        Path
                        Point
/;
use Type::Utils -all;
use List::Util qw/any/;
use List::SomeUtils qw/zip/;
use namespace::autoclean;

use Types::Standard -types;
#use Types::TypeTiny -types;

class_type CairoContext      => { class => 'Cairo::Context' };
class_type CairoSurface => { class => 'Cairo::Surface' };

class_type Color   => { class => 'CairoX::Sweet::Color' };
class_type CurveTo    => { class => 'CairoX::Sweet::Core::CurveTo' };
class_type LineTo    => { class => 'CairoX::Sweet::Core::LineTo' };
class_type MoveTo    => { class => 'CairoX::Sweet::Core::MoveTo' };
class_type Path    => { class => 'CairoX::Sweet::Path' };
class_type Point    => { class => 'CairoX::Sweet::Core::Point' };

declare ArrayRefNumOfTwo, as ArrayRef[Num],
    where { scalar @$_ % 2 == 0 },
    message {
        return ArrayRef->get_message($_) if !ArrayRef->check($_);
        return "Takes two values per unit";
    };
declare ArrayRefNumOfFour, as ArrayRef[Num],
    where { scalar @$_ % 4 == 0 },
    message {
        return ArrayRef->get_message($_) if !ArrayRef->check($_);
        return "Takes four values per unit";
    };
declare ArrayRefNumOfSix, as ArrayRef[Num],
    where { scalar @$_ % 6 == 0 },
    message {
        return ArrayRef->get_message($_) if !ArrayRef->check($_);
        return "Takes six values per unit";
    };

declare NumUpToOne, as Num,
    where { $_ >= 0 && $_ <= 1 },
    message {
        return Num->get_message($_) if !Num->check($_);
        return "$_ is too small. Minimum allowed value is 0" if $_ < 0;
        return "$_ is too big. Maximum allowed value is 1";
    };

coerce Color,
    from Str, via {
        my $str = $_;
        $str =~ s{^#}{};
        if($str =~ m{^([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$}i) {
            "CairoX::Sweet::Color"->new(red => (hex $1) / 255, green => (hex $2) / 255, blue => (hex $3) / 255 );
        }
    },
    from ArrayRef, via {
        my @array = @{ $_ };
        if(scalar @array == 3 || scalar @array == 4) {
            my $opacity = scalar @array == 4 ? pop @array : undef;

            my @colors = qw/red green blue/;
            if(any { int $_ != $_ } @array) {
                @colors = zip (@colors, @array);
            }
            else {
                @array = map { $_ / 255 } @array;



( run in 0.610 second using v1.01-cache-2.11-cpan-0bb4e1dffa6 )