diff variant_effect_predictor/Bio/EnsEMBL/Utils/Scalar.pm @ 0:21066c0abaf5 draft

Uploaded
author willmclaren
date Fri, 03 Aug 2012 10:04:48 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/variant_effect_predictor/Bio/EnsEMBL/Utils/Scalar.pm	Fri Aug 03 10:04:48 2012 -0400
@@ -0,0 +1,407 @@
+package Bio::EnsEMBL::Utils::Scalar;
+
+=pod
+
+=head1 LICENSE
+
+  Copyright (c) 1999-2012 The European Bioinformatics Institute and
+  Genome Research Limited.  All rights reserved.
+
+  This software is distributed under a modified Apache license.
+  For license details, please see
+
+    http://www.ensembl.org/info/about/code_licence.html
+
+=head1 CONTACT
+
+  Please email comments or questions to the public Ensembl
+  developers list at <dev@ensembl.org>.
+
+  Questions may also be sent to the Ensembl help desk at
+  <helpdesk@ensembl.org>.
+
+=cut
+
+=pod
+
+=head1 NAME
+
+Bio::EnsEMBL::Utils::Scalar
+
+=head1 SYNOPSIS
+
+	use Bio::EnsEMBL::Utils::Scalar qw(check_ref assert_ref wrap_array check_ref_can assert_ref_can assert_numeric assert_integer);
+
+	check_ref([], 'ARRAY'); # Will return true
+	check_ref({}, 'ARRAY'); # Will return false
+	check_ref($dba, 'Bio::EnsEMBL::DBSQL::DBAdaptor'); #Returns true if $dba is a DBAdaptor
+
+	assert_ref([], 'ARRAY'); #Returns true
+	assert_ref({}, 'ARRAY'); #throws an exception
+	assert_ref($dba, 'Bio::EnsEMBL::Gene'); #throws an exception if $dba is not a Gene
+
+	wrap_array([]); #Returns the same reference
+	wrap_array($a); #Returns [$a] if $a was not an array
+	wrap_array(undef); #Returns [] since incoming was undefined
+	wrap_array(); #Returns [] since incoming was empty (therefore undefined)
+
+	check_ref_can([], 'dbID'); #returns false as ArrayRef is not blessed
+	check_ref_can($gene, 'dbID'); #returns true as Gene should implement dbID()
+	check_ref_can(undef); #Throws an exception as we gave no method to test
+
+	assert_ref_can([], 'dbID'); #throws an exception since ArrayRef is not blessed
+	assert_ref_can($gene, 'dbID'); #returns true if gene implements dbID()
+	assert_ref_can(undef); #Throws an exception as we gave no method to test
+
+	asssert_integer(1, 'dbID'); #Passes
+	asssert_integer(1.1, 'dbID'); #Fails
+	asssert_numeric(1E-11, 'dbID'); #Passes
+	asssert_numeric({}, 'dbID'); #Fails
+
+	#Tags are also available for exporting
+	use Bio::EnsEMBL::Utils::Scalar qw(:assert); # brings in all assert methods
+	use Bio::EnsEMBL::Utils::Scalar qw(:check); #brings in all check methods
+	use Bio::EnsEMBL::Utils::Scalar qw(:array); #brings in wrap_array
+	use Bio::EnsEMBL::Utils::Scalar qw(:all); #import all methods
+
+=head1 DESCRIPTION
+
+A collection of subroutines aimed to helping Scalar based operations
+
+=head1 METHODS
+
+See subroutines.
+
+=head1 MAINTAINER
+
+$Author: ady $
+
+=head1 VERSION
+
+$Revision: 1.12 $
+
+=cut
+
+use strict;
+use warnings;
+
+use base qw(Exporter);
+
+our %EXPORT_TAGS;
+our @EXPORT_OK;
+
+@EXPORT_OK = qw(
+  check_ref check_ref_can
+  assert_ref assert_ref_can assert_numeric assert_integer assert_boolean assert_strand assert_file_handle
+  wrap_array
+);
+%EXPORT_TAGS = (
+  assert  => [qw(assert_ref assert_ref_can assert_integer assert_numeric assert_boolean assert_strand assert_file_handle)],
+  check   => [qw(check_ref check_ref_can)],
+  array   => [qw/wrap_array/],
+  all     => [@EXPORT_OK]
+);
+
+use Bio::EnsEMBL::Utils::Exception qw(throw);
+use Scalar::Util qw(blessed looks_like_number openhandle);
+
+=head2 check_ref()
+
+  Arg [1]     : The reference to check
+  Arg [2]     : The type we expect
+  Description : A subroutine which checks to see if the given object/ref is
+                what you expect. If you give it a blessed reference then it
+                will perform an isa() call on the object after the defined
+                tests. If it is a plain reference then it will use ref().
+
+                An undefined value will return a false.
+  Returntype  : Boolean indicating if the reference was the type we
+                expect
+  Example     : my $ok = check_ref([], 'ARRAY');
+  Exceptions  : If the expected type was not set
+  Status      : Stable
+
+=cut
+
+sub check_ref {
+	my ($ref, $expected) = @_;
+	throw('No expected type given') if ! defined $expected;
+	if(defined $ref) {
+		if(blessed($ref)) {
+			return 1 if $ref->isa($expected);
+		}
+		else {
+			my $ref_ref_type = ref($ref);
+			return 1 if defined $ref_ref_type && $ref_ref_type eq $expected;
+		}
+	}
+	return 0;
+}
+
+=head2 assert_ref()
+
+  Arg [1]     : The reference to check
+  Arg [2]     : The type we expect
+  Arg [3]     : The attribute name you are asserting; not required but allows
+                for more useful error messages to be generated. Defaults to
+                C<-Unknown->.
+  Description : A subroutine which checks to see if the given object/ref is
+                what you expect. This behaves in an identical manner as
+                C<check_ref()> does except this will raise exceptions when
+                the values do not match rather than returning a boolean
+                indicating the situation.
+
+                Undefs cause exception circumstances.
+  Returntype  : Boolean; true if we managed to get to the return
+  Example     : assert_ref([], 'ARRAY');
+  Exceptions  : If the expected type was not set and if the given reference
+                was not assignable to the expected value
+  Status      : Stable
+
+=cut
+
+sub assert_ref {
+  my ($ref, $expected, $attribute_name) = @_;
+  $attribute_name ||= '-Unknown-';
+  throw('No expected type given') if ! defined $expected;
+  my $class = ref($ref);
+  throw("The given reference for attribute $attribute_name was undef") unless defined $ref;
+  throw("Asking for the type of the attribute $attribute_name produced no type; check it is a reference") unless $class;
+  if(blessed($ref)) {
+    throw("${attribute_name}'s type '${class}' is not an ISA of '${expected}'") if ! $ref->isa($expected);
+  }
+  else {
+    throw("$attribute_name was expected to be '${expected}' but was '${class}'") if $expected ne $class;
+  }
+  return 1;
+}
+
+=head2 wrap_array()
+
+  Arg         : The reference we want to wrap in an array
+  Description : Takes in a reference and returns either the reference if it
+                was already an array, the reference wrapped in an array or
+                an empty array (if the given value was undefined).
+  Returntype  : Array Reference
+  Example     : my $a = wrap_array($input);
+  Exceptions  : None
+  Status      : Stable
+
+=cut
+
+sub wrap_array {
+  my ($incoming_reference) = @_;
+  if(defined $incoming_reference) {
+    if(check_ref($incoming_reference, 'ARRAY')) {
+      return $incoming_reference;
+    }
+    else {
+      return [$incoming_reference];
+    }
+  }
+  return [];
+}
+
+=head2 check_ref_can
+
+  Arg [1]     : The reference to check
+  Arg [2]     : The method we expect to run
+  Description : A subroutine which checks to see if the given object/ref is
+                implements the given method. This is very similar to the
+                functionality given by C<UNIVERSAL::can()> but works
+                by executing C<can()> on the object meaning we consult the
+                object's potentially overriden version rather than Perl's
+                default mechanism.
+  Returntype  : CodeRef
+  Example     : check_ref_can($gene, 'dbID');
+  Exceptions  : If the expected type was not set.
+  Status      : Stable
+
+=cut
+
+sub check_ref_can {
+  my ($ref, $method) = @_;
+  throw('No method given') if ! defined $method;
+  return unless defined $ref && blessed($ref);
+  return $ref->can($method);
+}
+
+=head2 assert_ref_can
+
+  Arg [1]     : The reference to check
+  Arg [2]     : The method we expect to run
+  Arg [3]     : The attribute name you are asserting; not required but allows
+                for more useful error messages to be generated. Defaults to
+                C<-Unknown->.
+  Description : A subroutine which checks to see if the given object/ref is
+                implements the given method. Will throw exceptions.
+  Returntype  : Boolean; true if we managed to get to the return
+  Example     : assert_ref_can($gene, 'dbID');
+  Exceptions  : If the reference is not defined, if the object does not
+                implement the given method and if no method was given to check
+  Status      : Stable
+
+=cut
+
+sub assert_ref_can {
+  my ($ref, $method, $attribute_name) = @_;
+  $attribute_name ||= '-Unknown-';
+  throw('No method given') if ! defined $method;
+  throw "The given reference $attribute_name is not defined" unless defined $ref;
+  throw "The given reference $attribute_name is not blessed" unless blessed($ref);
+  if(! $ref->can($method)) {
+    my $str_ref = ref($ref);
+    throw sprintf(q{The given blessed reference '%s' for attribute '%s' does not implement the method '%s'}, $str_ref, $attribute_name, $method);
+  }
+  return 1;
+}
+
+=head2 assert_numeric
+
+  Arg [1]     : The Scalar to check
+  Arg [2]     : The attribute name you are asserting; not required but allows
+                for more useful error messages to be generated. Defaults to
+                C<-Unknown->.
+  Description : A subroutine which checks to see if the given scalar is
+                number or not. If not then we raise exceptions detailing why
+  Returntype  : Boolean; true if we had a numeric otherwise we signal failure
+                via exceptions
+  Example     : assert_numeric(1, 'dbID');
+  Exceptions  : If the Scalar is not defined, if the Scalar was blessed and
+                if the value was not a number
+  Status      : Stable
+
+=cut
+
+sub assert_numeric {
+  my ($integer, $attribute_name) = @_;
+  $attribute_name ||= '-Unknown-';
+  throw "$attribute_name attribute is undefined" if ! defined $integer;
+  throw "The given attribute $attribute_name is blessed; cannot work with blessed values" if blessed($integer);
+  if(! looks_like_number($integer)) {
+    throw "Attribute $attribute_name was not a number";
+  }
+  return 1;
+}
+
+=head2 assert_integer
+
+  Arg [1]     : The Scalar to check
+  Arg [2]     : The attribute name you are asserting; not required but allows
+                for more useful error messages to be generated. Defaults to
+                C<-Unknown->.
+  Description : A subroutine which checks to see if the given scalar is
+                a whole integer; we delegate to L<assert_numeric> for number
+                checking.
+  Returntype  : Boolean; true if we had a numeric otherwise we signal failure
+                via exceptions
+  Example     : assert_integer(1, 'dbID');
+  Exceptions  : See L<assert_numeric> and we raise exceptions if the value
+                was not a whole integer
+  Status      : Stable
+
+=cut
+
+sub assert_integer {
+  my ($integer, $attribute_name) = @_;
+  $attribute_name ||= '-Unknown-';
+  assert_numeric($integer, $attribute_name);
+  if($integer != int($integer)) {
+    throw "Attribute $attribute_name was a number but not an Integer";
+  }
+  return 1;
+}
+
+=head2 assert_boolean
+
+  Arg [1]     : The Scalar to check
+  Arg [2]     : The attribute name you are asserting; not required but allows
+                for more useful error messages to be generated. Defaults to
+                C<-Unknown->.
+  Description : A subroutine which checks to see if the given scalar is
+                a boolean i.e. value is set to C<1> or C<0>
+  Returntype  : Boolean; true if we were given a boolean otherwise we signal
+                failure via exceptions
+  Example     : assert_boolean(1, 'is_circular');
+  Exceptions  : See L<assert_integer> and we raise exceptions if the value
+                was not equal to the 2 valid states
+  Status      : Stable
+
+=cut
+
+sub assert_boolean {
+  my ($boolean, $attribute_name) = @_;
+  $attribute_name ||= '-Unknown-';
+  assert_numeric($boolean, $attribute_name);
+  if($boolean != 0 && $boolean != 1) {
+    throw "Attribute $attribute_name was an invalid boolean. Expected: 1 or 0. Got: $boolean";
+  }
+  return 1;
+}
+
+=head2 assert_strand
+
+  Arg [1]     : The Scalar to check
+  Arg [2]     : The attribute name you are asserting; not required but allows
+                for more useful error messages to be generated. Defaults to
+                C<-Unknown->.
+  Description : A subroutine which checks to see if the given scalar is
+                a whole integer and if the value is set to C<1>, C<0> or C<-1>
+  Returntype  : Boolean; true if we had a strand integer otherwise we signal
+                failure via exceptions
+  Example     : assert_strand(1, 'strand');
+  Exceptions  : See L<assert_integer> and we raise exceptions if the value
+                was not equal to the 3 valid states
+  Status      : Stable
+
+=cut
+
+sub assert_strand {
+  my ($strand, $attribute_name) = @_;
+  $attribute_name ||= '-Unknown-';
+  assert_numeric($strand, $attribute_name);
+  if($strand != -1 && $strand != 0 && $strand ne 1) {
+    throw "Attribute $attribute_name was an invalid strand. Expected: 1, 0 or -1. Got: $strand";
+  }
+  return 1;
+}
+
+
+=head2 assert_file_handle
+
+  Arg [1]     : The Scalar to check
+  Arg [2]     : The attribute name you are asserting; not required but allows
+                for more useful error messages to be generated. Defaults to
+                C<-Unknown->.
+  Description : A subroutine which checks to see if the given scalar is
+                actually a file handle. This will handle those which are Glob
+                references and those which inherit from C<IO::Handle>. It will
+                also cope with a blessed Glob reference.
+  Returntype  : Boolean;
+  Example     : assert_file_handle($fh, '-FILE_HANDLE');
+  Exceptions  : Raised if not defined, not a reference and was not a
+                GLOB or did not inherit from IO::Handle   
+  Status      : Stable
+
+=cut
+
+sub assert_file_handle {
+  my ($file_handle, $attribute_name) = @_;
+  $attribute_name ||= '-Unknown-';
+  throw "Attribute $attribute_name was undefined" if ! defined $file_handle;
+  my $ref = ref($file_handle);
+  throw "Attribute $attribute_name was not a reference. Got: $file_handle" if ! $ref;
+  if(!openhandle($file_handle)) {
+    if(blessed($file_handle)) {
+      if(! $file_handle->isa('IO::Handle')) {
+        throw "Attribute $attribute_name was blessed but did not inherit from IO::Handle. Ref was: $ref";
+      }
+    }
+    else {
+      throw "Attribute $attribute_name was not a file handle. Ref was: $ref";
+    }
+  }
+  return 1;
+}
+
+1;