Data-URIID
view release on metacpan or search on metacpan
lib/Data/URIID/Colour.pm view on Meta::CPAN
# Copyright (c) 2023-2026 Philipp Schafft
# licensed under Artistic License 2.0 (see LICENSE file)
# ABSTRACT: Extractor for identifiers from URIs
package Data::URIID::Colour;
use strict;
use warnings;
use v5.16;
use overload '""' => \&rgb;
use Carp;
use Scalar::Util qw(weaken blessed);
our $VERSION = v0.24;
use parent qw(Data::URIID::Base Data::Identifier::Interface::Known);
my %_registered;
sub new {
my ($pkg, %opts) = @_;
my __PACKAGE__ $self;
if (defined(my $from = delete($opts{from}))) {
if (blessed $from) {
if ($from->isa('Data::URIID::Base')) {
$opts{extractor} //= $from->extractor(default => undef);
}
if ($from->isa(__PACKAGE__)) {
$opts{rgb} //= $from->rgb;
} elsif ($from->isa('Data::Identifier')) {
if (!defined($opts{rgb}) && eval {$from->generator->eq('55febcc4-6655-4397-ae3d-2353b5856b34')}) {
if (defined(my $v = $from->request)) {
if ($v =~ /^#[0-9a-fA-F]{6}$/) {
$opts{rgb} //= $v;
}
}
}
$from = $from->ise;
} elsif ($from->isa('Convert::Color::RGB8')) {
$opts{rgb} //= '#'.$from->hex;
} else {
$from = $from->ise;
}
}
$opts{rgb} //= $_registered{$from};
}
croak 'No RGB value given' unless defined $opts{rgb};
$opts{rgb} = uc($opts{rgb});
$opts{rgb} =~ /^#[0-9A-F]{6}$/ or die 'Bad format';
weaken($opts{extractor});
$self = bless \%opts, $pkg;
return $self;
}
sub rgb {
my ($self) = @_;
return $self->{rgb} // croak 'No RGB value';
}
sub known {
my ($pkg, $class, %opts) = @_;
$opts{extractor} //= $pkg->extractor(default => undef) if ref $pkg;
return $pkg->SUPER::known($class, %opts);
}
# --- Overrides for Data::URIID::Base ---
sub ise {
my ($self, %opts) = @_;
unless (defined $self->{ise}) {
require Data::Identifier::Generate;
$self->{ise} = Data::Identifier::Generate->colour($self->rgb)->ise;
}
return $self->SUPER::ise(%opts);
}
sub displayname {
my ($self, %opts) = @_;
return $self->SUPER::displayname(%opts, _fallback => $self->rgb);
}
# --- Overrides for Data::URIID::Base ---
sub _known_provider {
my ($pkg, $class, %opts) = @_;
croak 'Unsupported options passed' if scalar(keys %opts);
return ([keys %_registered], rawtype => 'ise') if $class eq ':all';
croak 'Unsupported class';
}
# ---- Private helpers ----
sub as {
my ($self, $as, @opts) = @_;
if (scalar(@opts) == 0) {
if ($as eq 'Convert::Color' || $as eq 'Convert::Color::RGB8') {
require Convert::Color::RGB8;
return Convert::Color::RGB8->new(substr($self->rgb, 1));
} elsif ($as eq 'Convert::Color::RGB16') {
require Convert::Color::RGB16;
return Convert::Color::RGB16->new($self->rgb =~ s/^#(..)(..)(..)\z/$1$1$2$2$3$3/r);
} elsif ($as eq 'Convert::Color::X11' || $as eq 'Convert::Color::VGA') {
require Convert::Color::RGB8;
my $rgb8 = Convert::Color::RGB8->new(substr($self->rgb, 1));
( run in 0.792 second using v1.01-cache-2.11-cpan-5c0b1e786e0 )