The $class Library

I’ve been less than thrilled with most of the techniques and libraries for creating object-oriented Javascript that are available on the web. Many of them suffer from problems such as awkward syntax, parent class constructors being called just to set up inheritance, and closures that carry along a larger scope than they need. I decided to create my own library that avoids the many problems and adds extra features that other techniques and libraries are lacking.

Introducing: The $class Library

I may have gone a bit overboard, or I may have created something useful; I’ll let you be the judge :) . I know some people like to jump into the code right away, so here’s the downloads. Keep reading for more details, references and examples.

  • A demo page: demo.html
  • The debug version with all error checking: class-debug.js
  • The minimal functionality version for deployment: class.js
  • The compressed minimal functionality version for deployment: class-min.js

If this library is the best thing since sliced bread for your next big project, please consider thanking me in a way that will support further development:



Quick List of Features

  • Nifty, intuitive syntax (somewhat similar to Java).
  • Allows for abstract methods, final methods, static properties, inheritance, interfaces and more.
  • Helpful error detection to enforce proper usage of features.
  • The prototype chain is properly created (so the instanceof operator works properly).
  • Constructors are only executed when actually constructing objects (not when setting up inheritance).
  • Makes some minor Javascript annoyances go away (such as the indentity crisis of RegExp and null).
  • Does not depend on any properties or methods that only exist in web browser environments, so it should work in any Javascript implementation.

Creating Classes

Defining classes is made easy with the $class function:

$class(className, classDescriptor);
Creates a new class, its constructor function, and adds the desired properties.

[className]
A String containing the name of the class to create. This name will be used to create a global variable to hold a reference to the newly created constructor function. This must be a valid Javascript identifier. Any periods (.) in the name will be evaluated as property accessors. For example, a class named “Object.Whatever” would be stored on the “Whatever” property of the Object constructor function
[classDescriptor]
An anonymous object that describes the class. The following properties are handled as special cases:

$constructor/[className]
[optional] Defines the class’s constructor. Its value must be a function. The property’s name can either be “$constructor”, or the name of the class. For example, if the class’s name is “Object.Whatever”, the constructor property name would be “Whatever”. If this property is absent, a default constructor will be intelligently supplied that either does nothing or calls the parent class’s constructor with all the arguments it received. If the class is extending another class that requires initialization and you do not explicitly call the parent class’s constructor (using the special this.$base property), the parent class’s constructor will be automatically called before your constructor code is executed (with the entire arguments array passed). If the constructor is declared as final, no class will be able to extend this class.
$static
[optional] Defines the class’s static initializer. Its value must be a function. The function will be called in the context of the constructor immediately after the class has been defined.
$extends
[optional] Specifies the class’s parent class. Its value must be a constructor function of some class. All methods of the parent class will inherited via prototype chaining. Static properties and methods are NOT inherited when extending a class. An instance of the class will be considered an instance of the parent class when using the native Javascript instanceof operator. If not specified, the parent class will default to Object.
$implements
[optional] Specifies the interface(s) to implement. Its value must be an $interface or an array of $interfaces ($interfaces are created with the $interface function described later). After the entire descriptor has been processed, an exception will be thrown if any interface methods are not implemented by the class (the exception message will have helpful details). An instance of the class will not be considered an instance of any of the interfaces when using the native Javascript instanceof operator (it’ll actually throw an exception because an $interface is not a valid operand). Instead, you’ll have to use the custom $class.instanceOf function (described later).
toString
[optional] If the class does not have a toString method (meaning it is just inheriting the toString method from the Object prototype), then a default toString method will be created that returns "[object " + className + "]", which is much more interesting than the Object prototype’s implementation that simply returns "[object Object]"


For any other properties in the descriptor, the behavior depends on whether the value is passed through one of the modifier functions or not. If a modifier is not used, the value is simply put in the class’s prototype as a property with the same name as the property in the descriptor. This is generally used to create instance methods, member functions, or whatever you want to call them. The following modifiers are functions that accept the value of the property to be modified and return an object representing the value and how the property is to be modified:

$static
Creates a class property with the provided value rather than an instance property.
$final
This modifier only applies to values that are functions. Like in Java, any method marked as final cannot be overriden by any class that extends this class. This modifier can also be used on the $constructor property.
$abstract
This modifier only applies to values that are functions. Like in Java, any method marked as abstract does not yet have an implementation. The function passed to the $abstract modifier is never used, but it’s nice to provide a dummy function with a formal parameter list and some notes about how it should be implemented in classes that extend this class. Because Javascript is not compiled, you cannot be notified if you attempt to instantiate an abstract class until the constructor for that abstract class is executed.
[return value]
void

Example 1:

$class("Something", {
  Something: function(name) {
    this._name = name;
  },

  getName: function() {
    return this._name;
  },

  A_STATIC_VALUE: $static(1),

  foo: $static(function() {
    // in static methods, "this" refers to the class's constructor
    // (where static properties are stored)
    return this.A_STATIC_VALUE;
  })
});

Usage of Example 1:

var x = new Something("Pickle");

alert(x);                        // [object Something]
alert(x.getName());              // Pickle
alert(Something.A_STATIC_VALUE); // 1
alert(Something.foo());          // 1
alert(x.A_STATIC_VALUE);         // undefined

The $class Class

The $class function used for creating classes is also used internally as a constructor that creates an object representing the class. That object is then stored on the $class property of the constructor function. So using the class from Example 1, Something.$class would be an instance of $class that contains information about the Something class. The library also creates a $class object for all of the standard Javascript constructor functions (such as Object, Number, Error, Date, etc.). Here’s what the $class object can do for you:

$class.prototype.getName();
Gets the class’s name.

[return value]
A String containing the full name of this class.
$class.prototype.isNative();
Determines whether the class is a native Javascript class (Object, Number, Function, etc.)

[return value]
A Boolean; true if the class is a native Javascript class.
$class.prototype.getConstructor();
Gets the constructor function for the class.

[return value]
The constructor function of this class.
$class.prototype.getSuperclass();
Gets the parent class of the class.

[return value]
The $class object representing this class’s super (parent) class, or null if this class has no super class (which only happens with Object because everything extends Object, if nothing else)
$class.prototype.isInstance(obj);
Determines if an object is an instance of the class.

[obj]
Any object
[return value]
A Boolean; true iff [obj] is an instance of this class or any class that extends this class.
$class.prototype.implementsInterface(iface);
Determines if the class implements a specified interface.

[iface]
An $interface
[return value]
A Boolean; true iff this class implements the $interface [iface].
$class.resolve(qualifiedName);
Resolves a qualified name. For example, $class.resolve("window.document.body") would return a reference to window.document.body, and $class.resolve("window.worm.body") would return undefined (assuming window has no property named “worm”).

[qualifiedName]
A String whose value is a fully qualified name.
[return value]
If the qualified name is successfully resolved, the value of the specified identifier is returned. Otherwise, undefined.
$class.implementationOf(obj, iface);
Determines if an object implements a specified interface.

[obj]
Any object
[iface]
An $interface
[return value]
A Boolean; true iff [obj] is an instance of a class that implements the $interface [iface].
$class.instanceOf(obj, ctorFunctionOrIface);
Determines if an object implements a specified interface, or is an instance of a specified class.

[obj]
Any object
[ctorFunctionOrIface]
A constructor function or an $interface
[return value]
A Boolean; If [ctorFunctionOrIface] is an $interface, then the result of $class.implementationOf([obj], [ctorFunctionOrIface]) is returned. Otherwise, this function returns true iff [obj] is an instance of the class whose constructor function is [ctorFunctionOrIface] (or a class that extends the class whose constructor function is [ctorFunctionOrIface]). Unlike the built-in instanceof operator, built-in data type values will be considered instances of their object counterparts. For example ("hello" instanceof String) returns false, but $class.instanceOf("hello", String) returns true.
$class.typeOf(obj);
Gets the class name of an object.

[obj]
Any object
[return value]
A String containing the full name of the class of [obj]. Unlike the built-in typeof operator, this function returns the actual name of the class rather than identifying all objects as "object". This function also identifies built-in type values as their object counterparts. For example, $class.typeOf("hello") returns "String". If the type of [obj] cannot be determined (because it is not an instance of a class created by $class, or one of the standard Javascript types), the result will be "Object".
$class.getClass(obj);
Gets the $class object of an object.

[obj]
Any object
[return value]
The $class object for the class of [obj]. This function also identifies built-in type values as their object counterparts. For example, $class.getClass("hello") returns String.$class. If the type of [obj] cannot be determined (because it is not an instance of a class created by $class, or one of the standard Javascript types), the result will be Object.$class.
$class.instantiate(ctor, args);
Instantiates an object of a specified type using an array of arguments.

[ctor]
A constructor function
[args]
An array of arguments to be passed to the constructor
[return value]
The newly instantiated object.

Creating Interfaces

Interfaces are much like the interfaces in Java. An interface basically declares, but does not define (implement), instance methods. Classes can then implement the interface and provide implementations for all of the instance methods. Many unrelated classes could implement the same interface, providing a common way to use them. Interfaces are created with the $interface function:

$interface(interfaceName, interfaceDescriptor);
Creates a new interface with the specified methods and static properties.

[interfaceName]
A String containing the name of the interface. This name will be used to create a global variable to hold a reference to the newly created interface. This must be a valid Javascript identifier. Any periods (.) in the name will be evaluated as property accessors. For example, an interface named “Object.Whatever” would be stored on the “Whatever” property of the Object constructor function
[interfaceDescriptor]
An anonymous object that describes the interface. The following properties are handled as special cases:

$constructor
$static
$implements
Not allowed
$extends
[optional] Specifies the interface(s) to extend. Its value must be an $interface or an array of $interfaces. This interface will inherit all static properties and all method declarations from the interfaces. A class that implements this interface will be considered an implementation of this interface and all interfaces that this interface extends.

For any other properties in the descriptor, the value must either be a function or a value modified by the $static function. Function values cause the property to be registered as an interface method. The function itself is ignored, but it is nice to provide a formal parameter list and comments about how implementations of the method are expected to behave. Values modified with the $static function cause a static property with that value to be added to the interface.

[return value]
void

Example 2:

$interface("Named", {
  getName: function() {
    return String();
  },

  sayMyName: $static(function(namedObj) {
    if ($class.instanceOf(namedObj, Named)) {
      alert(namedObj.getName());
    } else {
      alert("Not a named object");
    }
  },

  ANOTHER_STATIC_VALUE: $static("hello")
});

Example 2 defines an interface with a method and a static value. Any class that implements this interface MUST have a method named “getName”. Note that static methods of an interface are implemented in the interface itself, not in implementing classes. You can’t do much with an interface by itself other than accessing its static properties, like this:

Usage of Example 2:

alert(Named.ANOTHER_STATIC_VALUE); // hello
alert(Named.sayMyName("blah"));    // Not a named object

The $interface Class

The interface created by the $interface function is an instance of $interface.

$interface.prototype.getName();
Gets the name of the interface.

[return value]
A String containing the full name of this interface.
$interface.prototype.getMethods();
Gets names of all the methods declared by the interface (and all interfaces that it extends).

[return value]
An array of Strings containing the names of the interface’s methods.
$interface.prototype.hasMethod(methodName);
Tests if the interface declares a specified method.

[methodName]
A String containing the name of a method.
[return value]
A Boolean; true iff the interface (or any of the interfaces that it extends) declares a method with the name specified by [methodName].

The Special this.$base Property

This feature was inspired by Dean Edwards’ Base class. When a class overrides a method of a class that it extends, a special property called “$base” is created on the object instance whenever the overriding method is called. The $base property is a reference to the overridden method. This allows you to easily implement methods in terms of the overridden implementation of the same method.

Example 3 (uses the class from Example 1):

$class("SomethingAndABagOfChips", {
  $extends: Something,

  getName: function() {
    return this.$base() + " and a bag of chips";
  }
});

Usage of Example 3:

var x = new SomethingAndABagOfChips("All that");

alert(x.getName());

The result of the Usage of Example 3 would be an alert box containing “All that and a bag of chips”. Notice that a constructor was automatically generated for SomethingAndABagOfChips that called the constructor for Something.

Odds and Ends

A class Undefined is defined to be the type of undefined.

  • $class.typeOf(undefined) == "Undefined"
  • $class.getClass(undefined) == Undefined.$class
  • $class.instanceOf(undefined, Undefined) == true
  • $class.instanceOf(undefined, Object) == false

A class Null is defined to be the type of null.

  • $class.typeOf(null) == "Null"
  • $class.getClass(null) == Null.$class
  • $class.instanceOf(null, Null) == true
  • $class.instanceOf(null, Object) == false

The $class library helps null with its identity crisis.

  • $class.typeOf(null) == "Null"
  • $class.getClass(null) == Null.$class
  • $class.instanceOf(null, Null) == true
  • $class.instanceOf(null, Object) == false

The $class library helps RegExp with its identity crisis.

  • $class.typeOf(new RegExp()) == "RegExp"
  • $class.instanceOf(new RegExp(), RegExp) == true
  • $class.instanceOf(new RegExp(), Function) == true
  • $class.getClass(new RegExp()).getSuperclass() == Function.$class


A nice base class for exceptions is provided. It has the name and message properties that some browsers look for when logging uncaught exceptions in their javascript consoles. The name is automatically set to the name of the type of the exception object and a nice toString method is supplied (because some browsers display that in their javascript consoles).

$class("Exception", {
  $extends: Error,

  $constructor: function(message) { ... },

  getName: $final(function() { ... }),

  getMessage: $final(function() { ... }),

  toString: $final(function() { ... })
});

History

1.5
  • Added the $class.prototype.isNative method.
  • Added the $class.instantiate method.
1.4.3
  • Fixed a bug that caused the special this.$base property to not be set when this library is used in the Photoshop scripting environment.
  • Fixed comments at the beginning of the debug version file that describe how to log debugging messages from the $class library.
1.4.2
  • Removed some features and behaviors that turned out to be unnecessary and/or unreliable, such as attempts to log debug info from the Exception class and inheriting of static properties/methods.
  • Improved constructor support, such as automatic base class initialization and intelligent default constructors.
  • Many optimizations, especially in the non-debug version.
1.2.3
  • Improvements to the Exception class, including filename and line number information in the toString() result (only in Firefox).
1.2.2
  • Static methods now have access the the special this.$base property to refer to the static method of the same name from a base class.
  • Constructors can now be declared as final (with the $final() modifier function) to prevent any class from extending it.
1.2.1
  • Fixed a bug that caused static initializers to not really be called in the context of the constructor function.
  • Fixed the null value’s identity crisis.
  • The Exception class now logs itself to the Firebug console in Firefox whenever an instance of Exception (or one of its decendants) is instantiated.
1.2
  • Static properties are now inherited when extending a class.
  • Static methods are now also available on the prototype as instance methods.
  • Static initializer now called in the context of the class’s constructor function, rather than the global scope.
1.1.1
  • Fixed a bug in the abstract instantiation check that caused an error even when instantiating a derived class that implements all abstract methods.
1.1
  • Added constructor-time check to prevent instantiation of abstract classes.
1.0
  • Initial release

5 Responses to “The $class Library”

  1. StickBlog » Blog Archive » Object-oriented Javascript Says:

    […] Here’s a promising project: an effort to create an elegant OO implementation of Javascript. The author has taken a rather different approach to those I’ve seen in the past, and what he’s achieved already is quite impressive. I have to admit that I haven’t tried it yet, so it could be completely useless — but it certainly looks good. […]

  2. Stickman Says:

    Hi

    Well you commented on my blog post linking to this page, to point out that you haven’t had any feedback to help you improve the library. Well I’m hoping to make a start on a heavily JS-dependent project sometime in the next few weeks, and I was thinking I might make us of your library. If I do, I be sure and pass on any feedback.

    Either way, I wish you the best of luck with it.

    Stickman

  3. forest Says:

    Thanks for the great class library that can be used outside of the browser!

    I develop software on top of the Photoshop JavaScript framework and need to do some refactoring. I originally used some code from for class inheritance, but it only allows you to subclass one level deep. Then I found and was very happy with the design and future inclusion in prototype which I use. BUT, it doesn’t fully work when run in the Photoshop scripting framework. (It does work in the browser. Big surprise!) When browsing the comments on Base I ran into your post, and decided to try out one more class library, and to my surprise it works!

    I originally used the debug version, but there was an issue with $base until i got rid of the “!==” check [edit: fixed in version 1.4.3] , and then everything was fine. The release code doesn’t have this problem.

    Thanks again, and I will let you know if I have any issues.

    forest

  4. alvinwoon Says:

    i have played around with it a bit and it’s pretty nice. I would like to move it from my playground to some real world applications our team is working on but it would be really helpful to see some speed test and regression testing on this library prior…

    As you might have already noticed before writing this nifty thing, some of this ‘making JS a more OO language’ libraries actually slow the applications down to a noticeable level :( .

    I am not implying this thing is slow (i havent look that far into it). But if it is the equivalent of the $ function in prototype library, i would rather prefer to keep my getElementById if you know what i mean.

    But great job! The syntax almost makes the code self-documenting ^_^.

  5. UselessPickles Says:

    I won’t be able to spend time on any speed tests for a while, but I can post some theoretical expectations. I also plan on writing some JsUnit test cases some day so that it can be verified that the 2 versions of the library work the same (minus the error detection, of course).

    The debug version does have quite a bit of overhead, but that overhead is only needed during development. Once the code has been developed, you can switch to using the trimmed down version that assumes you created all your classes properly, implemented all interface methods, etc.

    The most overhead occurs when a class is actually declared because the code must loop through all of the properties in the class descriptor and process them (set up inheritence, add to the prototype, wrap methods that require acess to this.$base, etc). Unless you are declaring thousands of classes, the overhead will probably not be noticable.

    Instantiating a class could have the overhead of an extra function call to initialize a base class (recursively all the way to the base class). If some classes in the heierarchy have default constructors, they will be skipped over during construction to reduce that overhead. I think it’s pretty much the same overhead you would incur if you manually initialized your base classes without using the $class library.

    Calling instance methods that use the this.$base property will have the overhead of one function call and some property access/assignment to set up the this.$base property.

    Calling instance methods that don’t use this.$base, accessing properties, accessing static properties, etc. have no overhead at all.

    Using $class.instanceOf rather than the instanceof operator provides some convenience at the cost of some overhead (look at the implementation of the method for details). On a case-by-case basis, if you can determine that you do not need the convenience and performance is critical, go with the instanceof operator for zero overhead. Note that you cannot use the instanceof operator to test if something implements an interface (you must use either $class.instanceOf or $class.implementationOf).

    I hope this helped. If anyone decides to do some independent speed test comparisons of object-oriented code with and without the $class library, please submit your findings for all to see :)

Leave a Reply

You must be logged in to post a comment.


weaning cat off valium tylenol ultra tylenol and low pollen synthesis of tylenol tylenol with codeine picture viagra dosage information tylenol and aleve together class action suit vioxx bryan tylenol with vaccines valium alchohl taking tylenol can tylenol dose chart generic viagra uk online pharmacy medication ultram faq valium roche 10 viagra and other ed drugs tylenol infants tylenol motrin advil recommended dosage for viagra generic online order viagra american customs canida tylenol codeine ultracet and ultram cyanide poisoning tylenol tylenol allergy sinus day time woman's viagra s tylenol vicodin prescription drug abruptly stopping tylenol pm tylenol pm effects ultram in 9 panel drug test tylenol cold cool blast can i take benedryl with tylenol insurance coverage viagra health attack celebrex cyber heart pharmacy vioxx danger of expired tylenol online pharmacies for valium and somas signs of tylenol addiction ultram oral medication valtrex pills photo cyalis generic lowest price viagra ultram drug screens codeine pain tylenol 4 viagra retin-a ed erectile dysfunction dosage for children tylenol drug get online viagra buy levitra vardenafil discount cialis levitra viagra valium and liver function cialis versus viagra side effects does atenolol and viagra mix online prescription valtrex tylenol interactions mixing tylenol and advil viagra full prescribing information online pharmacy vicodin no prescription valtrex shingles gabapentin vestibular therapy valium purchase nonprescription generic valtrex tylenol codeine 3 fda tylenol congestion tylenol 5 buy viagra from canada can you smoke tylenol with codeine tylenol brand scholarship fund ultram 2b medication pravachol bontril actos vaniqa nascar tylenol rapid release contest viagra tablet valacyclovir acyclovir or famciclovir synthesis of tylenol reaction mechanism online pharmacies for vicodin without prescription attorney miami vioxx buy prescription ultram without fedex valium valium or xanax cod for valium codeine pregnancy tylenol viagra from health store information on ultram tab 50 mg successful treatment of migraines with valium gnc natural viagra drug ultram mixed with for fun valtrex buy prescription online prescription drugs mainlining tylenol 4 nonprescription generic valtrex fake generic viagra valium puchase tylenol reaction natural suppliments work like viagra pulmonary hypertension viagra vicodin no prescription pharmacy viagra for babies with pulmonary hypertension online pharmacy testosterone cream safe to give dog tylenol tylenol advertising tylenol dosage children washington tylenol valium brand of diazepam tylenol overdose amount for adults tylenol suicide tylenol childrens willow enterprises bulk tylenol health valium valium ultram and aspirin allergy tylenol childrens 4 oz recall on childrens tylenol vicodin es 7.5 750 is viagra effective for hypertension valium knock out doseage tylenol caplet poisonings vardenafil hcl online valium prescriptions celebrex versus vioxx coumadin headache tylenol free online order viagra valium onsubmit kidney tylenol alcohol viagra dosage recomendation msds for tylenol extra strength tylenol as a blood thinner tylenol child fever legal refill vicodin hydrocodone online prescription tylenol synthesis tylenol extra strength caplets verapamil erectile dysfunction darvocet without tylenol action class mexico new vioxx ben kweller tylenol johnson and johnson tylenol scare between difference levitra viagra childrens allergic reactions to tylenol viagra beneficial side effects oxycontin's tylenol content buy discount generic viagra valium use in society board casino message post viagra never mix beer and viagra picture tylenol toxic hydrocodone xodol vicodin germany ultram interactions with other drugs vicodin home detox information medil viagra dangers of ultram medicine viagra versus cialis espa ol tylenol overdose stages cheap drug generic prescription ultram wellbutrin effexor prozac trazodone valium from an american pharmacy drug prescription sale vicodin tylenol canada tylenol at celluar level valium online pharmacy 2737 aid prevacid viagra zyrtec seperating tylenol from hydrocodone tylenol ibuprofen melatonin hives tylenol flu drug mixing valium with cocaine generic gotabs tylenol tylenol for children dosage percocet 15mg oxycodone tylenol tylenol packaging tylenol pm addiction coupon for tylenol tylenol with codeine 4 chile viagra verbal download ringtone tylenol overdose in children tylenol 1982 tampering tylenol and newborn tylenol cold multi symptom gelcaps ordering infants tylenol tylenol fatal serum levels valium 10mg valium overnight delivery qoclick tylenol with codeine elixir 120 12 tylenol pm meth tylenol dayquil combination tylenol 4 percocet comparison motrin tylenol tylenol flue vicodin es drug can fosamax be taken with tylenol mixing alcohol with tylenol tylenol ads valium label use tylenol overdose mucomyst tylenol murder medication valium cheap online generic viagra tylenol tabs price of valium on the street valium duration drug prescription vicodin toprol side effects insomnia morphine and vicodin and allergy valium counterfeit freedom ultram dosage guide tylenol toxicity in baby body detoxification vicodin detox center tylenol conspiracy tylenol motrin dosing alternate chart tylenol overdose toddler can tylenol with codeine cause infertility buy vardenafil claritin with tylenol myonlinemeds biz ultram ultram zyrtec arizona vioxx class action valium band valium diazepam information valium consumed alcohal ok take vardenafil tylenol without codeine related constipation prescription dose of tylenol prescription drugs ultram dosages ultram 4.01 line valium tylenol poison is valtrex antibiotic viagra medical information 3 nortriptyline tylenol tylenol vaginally childrens tylenol waring tylenol cold multisymptom dosage for oral valium acyclovir and valtrex fee online viagra chart dosage tylenol viagra usual dosage tylenol given to dogs does tylenol affect seizure the chemical bonds of valium tylenol with codeine interraction calculate an overdose of tylenol l arginine natural viagra information about tylenol mike tylenol generic viagra and online pharmacies tylenol and benefits child reaction tylenol drug valium tylenol and dog tylenol allergy sinus ingredients online ultram prescription buy online securely viagra tylenol and kidnie ultram and arthritis valium diazepam effects human body cialis valtrex alesse johnson and johnson tylenol case tylenol blood thinner tylenol nosebleed generic names for valium ultram dream pharmaceutical viagra genetic is tylenol and excedrin danergous health net hmo viagra tylenol number4 percription tylenol advil mixing cocaine and tylenol viagra for sale uk active in ingredient tylenol valium promotional items valium no prescriptin nausea from tylenol buying tylenol with codeine tylenol manufacturer tylenol gout can tylenol damage oocyte find how to use viagra buy cheap valium uk suicide by tylenol overdose viagra lung disease kob valium vardenafil hci tablets online pharmacy uk tenuate prescription medications vicodin tylenol overdose cysteine tylenol 3 codeine mg online us pharmacies generic viagra softtabs compare uses for valium vs xanax is snorting tylenol bad celebrex lawyer rofecoxib tablet texas vioxx generic equivilent for valtrex tylenol disaster tylenol dosage for adults fever unresolved with tylenol lowest price viagra online baby tylenol over dose physical identification of tylenol precsription strength millenium pharmacy valium buy viagra pill online can viagra maintain erection after ejaculation xanax valium difference is valium better than klonopin tylenol vs advil commercial kaufen online viagra viagra administration tylenol film tablet symptoms of valium withdrawal black tar heroin and tylenol otc tylenol with codine from canada symptoms of overdose and tylenol pm tylenol effectiveness outpatient pediatric surgery ultram class drug taking tylenol and advil migraine valium cyclobenzaprine vs valium tylenol nomogram an add for tylenol in spanish buy viagra pills case law expired tylenol with codeine caribbean valium plant buy codeine online tylenol dose of tylenol tylenol bm sketch video release testosterone with weight training percocett and tylenol verified internet pharmacy practice sites viagra buy valium cheap pictures of tylenol what pregnancy category is tylenol in online pill viagra pill tylenol 303 tylenol with caffine by simply sleep tylenol drug interactions for viagra and coumadin valium pill free womens viagra zoloft interaction ultram cat aspirin alive tylenol johnson johnson the tylenol tragedy ultram generico trazodone help with insomnia valium pain relief ouch tylenol get a prescription online for valium ultram sold on internet tylenol 3 vs vicodin tylenol 600 valium psychosis 1519 vioxx heart attack lawsuit 2189 vicodin perscriptions valium from thailand best treatment for tylenol overdose ultram prozac seizure can u mix tylenol and motrin lithium depression valium giving dogs baby tylenol international drug store viagra valium have side effects valium with no perscription metronidazol and tylenol avoid fake risk viagra discount viagra 10 pack generic valtrex herpes treament dosage tylenol overdose antidote jobs with tylenol tylenol murders excedrin posted messages settlements over talking viagra famotidine and tylenol interaction free online viagra what happens if you snort valium tylenol and aspirin interaction tylenol with codine tylenol identification 44237 information on tylenol 3 viagra wine compare cialis levitra viagra johnson and johnson tylenol pr valtrex generic price bone health and tylenol overdose cheapest line viagra es price vicodin order viagra viagra online internet pharmacy ultram ultram dosage ultram drug teat tylenol contamination how was it resolved treatment of tylenol overdose tylenol simply sleep review tylenol doseage chart low cost viagra buy cheap online viagra vicodin detox center viagra sample canada cialis viagra online tylenol and codeine tylenol 222 s dosage tylenol w codeine ferrets tylenol rho valium tylenol 2004 tylenol players action class hampshire new vioxx class action illinois vioxx seroquel and valium 6x buy cheap domain valium whois trazodone 50mg insomnia child overdose tylenol valium 10 mg and 5 mg buy ultram now ativan re valium vs vs xanax drug vicodin prescription nursing and tylenol overdose celebrex or vioxx drug interactions with viagra tylenol and ibuprofen reaction action class suit vioxx dose tylenol cheapest generic price viagra caffeine tylenol reactions tylenol invention date codeine no 4 tylenol tylenol headquarters what is the drug ultram viagra health risk tylenol codeine 3 without prescription funzone tylenol contest hydrocodone tylenol seperation valium dilaudid interactions ultram arthritis xanax ativan and valium in pregnancy men with erectile dysfunction l-arginine viagra 20 tylenol celebrex with tylenol valium pakistan zoloft and trazodone getting high on ultram tylenol abuse buy viagra phentermine meridia adipex xenical bayer vs tylenol purchase tylenol with codeine viagra norvasc drug interaction tylenol vomiting mcneill lab tylenol viagra side effects alcohol viagra product information doses valium contraindications alcohol with viagra line pharmacy vicodin tylenol toxicity levels viagra online shop pill images and pictures valium vicodin ultram generic tylenol 650 mg po pr children with fevers and tylenol vicodin on-line tylenol scholarship fund action attack class heart vioxx attorney celebrex contraindications vioxx killer medication pain ultram tylenol infant drop dosage valium withdrawal difference in viagra dosage valium knock out tylenol brand recall coupons for children s tylenol viagra utility eebm diabetes viagra celebrex vioxx nsaid separate codeine from tylenol tylenol dosage by babies weight tylenol with codeien family of tylenol tampering deaths taking valium will cause weight loss buy viagra in london translation viagra sildenafil english-french baby tylenol how ofton relafen and tylenol ultram with oxycodone man health viagra valtrex insurance herpes tylenol infants dosage ultram recreational use viagra benefits side effects tylenol with codeine pregnant 1459 vioxx heart attack lawyer 2102 no prescription buy ultram online tylenol caffeine tylenol seven-year-old viagra as treatment for pulmonary hypertension 1st tylenol by johnson johnson arthritis tylenol drug cerebrex vioxx overthecounter pain medication tylenol pm active ingredient ultram nexium metrogel prevacid tylenol mystery tylenol urine valium before surgery viagra drug information viagra tylenol caplets flavor tylenol and website fever alternate tylenol ibuprofen new use for viagra efffect of tylenol on liver viagra from canada legitimate tylenol company obtain vardenafil on line tylenol hbp edinburgh report pages search viagra viagra buying online tylenol 4 with codeine taking tylenol with apo-citalopram diazepam valium purchase parkinsons and valium effects nitroglycern side viagra tailbone vicodin allergic to codeine viagra helth problems disease viagra heart viagra marketing tools over the counter viagra substitute drug addiction tenuate rectal tylenol dosing valtrex herpes nailbeds is tylenol a nsaid daily limit of tylenol class action lawsuits vioxx viagra drug information medicine pills ultram buying online ultram can atenolol be taken with viagra class action suit vioxx conroe tylenol toxicity ibuprofen tylenol together adult tylenol chemical compound in tylenol valium detection time urine finding ultram pain and killer tylenol $5.00 coupon viagra available from online doctor tylenol 3 codeine content dupa tylenol ultram ultram a span td tr cost of valium vs diazepam tylenol max dose info tylenol dosage for baby tylenol liver viagra derivatives viagra uk online class action suit vioxx beaumont motrin and tylenol viagra erection duration generic online pharmacy viagra concentrated tylenol infant drops buy valium without a prescription grapefruit tylenol valium insomnia diet in natural testosterone cheap generic prilosec propecia ultram ultram tylenol doses tylenol with codeine breast feeding ultram from side effects of taking viagra 2737 aid renova renova retin viagra generic famvir valtrex vicodin online buy vicodin what is mallinckro vicodin es buy cheapest online place viagra valium prescription valtrex causes ulcers order generic viagra online arkansas vioxx class action lawsuit ultram tablets action alabama class lawsuit vioxx tylenol cold non drowsy valtrex or famvir interaction valium tylenol and asthma 5 7 es vicodin tylenol and the liver vicodin es picture buy no online prescription ultram tylenol crisis 1992 viagra side effects tylenol hangover valium 10mg look like can i take valium and norco valium vs klonopin celebrex discount online order vioxx valiums side effects new side effects of viagra xanax compared to valium motrin or tylenol addiction treatment vicodin addiction treatment toprol drug abuse vicodin es mg costa rica tico paradise viagra dating tylenol with codeine and celexa viagra secondary pulmonary hypertension baby buy cheap valtrex valium delivery overnight childrens tylenol caugh and cold buy overseas viagra vardenafil medication viagra pain relief women cheap drug prescription retin ultram wellbutrin liver damage due to tylenol buy terbinafine without prescription naproxen 500 and tylenol tylenol nursing can valium treat tension headache ultracet v27s celebrex ultram addiction treatment ultram adverse effects generic valtrex in the us is tylenol a blood thiner attack heart lawyer vioxx generic valtrex cost generic viagra online order vicodin 7 xenical viagra zyban proscar viagra drug zenegra is tylenol good for pain valium rouche viagra pulmonary hypertension baby headache vicodin hydrocodone chewable tylenol recommendations taking hydrocodone and valium tylenol for colds tylenol when pregnant viagra prescribing info viagra online purchase vicodin compare tyenol codeine tylenol and breastfeeding tylenol ouch viagra patent europe ultram cheapest action class florida vioxx tylenol allergy when pregnant brand scholarship tylenol tylenol 1000 mg codeine in tylenol 3 johnson johnsons tylenol civil suit prescription vicodin 25mg celebrex cheap vioxx viagra from canada legitimate msnbc tylenol elixir with codeine tylenol choleostasis generic valtrex ranbaxy buy online order viagra 10mg valium picture california vioxx heart attack lawyer ultram online doctor prescription vicodin es 3596 alcohol and tylenol tylenol pediatric dose flexaril valium tylenol rapid release commercial cat valium withdrawal daily tylenol for treatment of arthritis closeout liquidation tylenol wholesale actions of mucomist in tylenol overdose tylenol with codeine and heart canine tylenol codeine los angeles flomax viagra interaction online uk viagra tylenol vending by vicodin getting prescription for vicodin hydrocodone clozopam valium increase testosterone diet exercise supplements viagra by mail attorney celebrex hypertension tx vioxx tylenol nursing scholarship baby tylenol bacteria viagra costs tamsulosin erectile dysfunction tylenol fast tabs neutropenia temazepam ending viagra use cialis v s viagra treatment of tylenol overdose in kids tylenol 3 codeine lowest price viagra viagra recommendations valium search engines when children s fever tylenol travel vending medicines tylenol sites computer viagra edinburgh find report nexium ultram alesse online pharmacy 1 codeine tylenol buy real viagra online tylenol for bone healing viagra plavix adderall valium combo high cortisol dhea testosterone insomnia pill images and pictres valium vocodin tylenol sinus non-prescription valium tylenol nsaid tylenol nsaids advil and tylenol looking 4 diet pills tenuate pregnant tylenol vicodin without prescription diet pill valium collect on delivery tylenol pm forums viagra and masturbation zithromax combined with other tylenol valium and alcohol effects tylenol cold and sinus is valtrex an antibiotic cialis versus viagra tylenol rash adverse b ultram b b online b viagra drugs tylenol 500 dosage tylenol in pregnancy miing tylenol and ibuprofin tamoxifen triggered fatigue baby tylenol how often love tylenol pm tylenol and dog pain valtrex help herpes labialis canadian pharmacy for valtrex free shipp cod line pharmacy vicodin valium quaalude tylenol with codeine no 3 ultram ordering caffeine content extra strength tylenol caplets tylenol codeine and birth defects ingredient tylenol pediatric dosing tylenol tylenol disease advil and tylenol for pain relief effects of aspirin vs tylenol whatever happened to women's tylenol get valium for free online pharmacy prescription vicodin tylenol allergy and sinus daytime hazards of mixing xanax and valium prescribing tylenol 4 tylenol drugs viagra drugs zenegra valium effectiveness valium without prescription tylenol senitivity drug insert viagra cheese tylenol tylenol contraindications action class oregon vioxx viagra online huge discounts percentage of people that take valium hydrocodone without tylenol ultram prescriptions fever reducer tylenol tylenol and metallic tast mixing valium with xanax tylenol tablets pictures tylenol costume mix motrin with tylenol and codeine tylenol risks hydrocodone vicodin prescription valium msds 1980 tylenol poisoning vardenafil medication online tylenol dmso hydrocodone msm viagra cialis levitra reviews liquid valium mixed drink valium no prescrription needed tylenol flu nighttime signs of infant tylenol overdose tylenol pm sleep bontril tylenol allergy multi-symptom reviews valium cipro valtrex cheap prices arthritis dog tylenol fioricet without tylenol online vardenafil hydrochloride tylenol dose tylenol with codeine during pregnancy psychological effects of tylenol 3 sleepytime tylenol medical alert tylenol pm tylenol for mononucleosis generic viagra online pharmacy ordering valium fast tylenol 20000 grams mix delsym and tylenol tylenol and advil together over the counter viagra alternatives taking tylenol with cephalexin drug interaction of xanax and valium valium online no prescription overnight delivery best buy viagra seizure valium natural supplement viagra pain drugs vicodin online pharmacy prescription buy viagra in uk health viagra insurance coverage indian drug companies producing viagra equivalent tylenol and aleve combined non perscription vicodin cheap drug prescription prilosec retin ultram overnight delivery for valium without prescription buy viagra line valium injections methyl testosterone online pharmacy tylenol antiinflamatory xanax and valium online phentermine prescription valtrex zyban ultram antidepressant viagra cialis online viagra flomax buy viagra cheapest tylenol allergy tylenol dose for cildren free viagra online valium images pictures valium dosing schedule alchoholic equivilent to valium buy testosterone without a prescription tylenol verses midol infant's tylenol excitability tramacet and tylenol 2737 aid allergy ultram active ingredients in tylenol pm childrens tylenol coupon azithromycin zpack combined with other tylenol viagra gay stories tylenol baby drops dosage bush buy porn viagra viagra online in canada prescribing instructions valium valium illegal drugs valium as anticonvulsant what is tylenol suicide methods temazepam and zoloft buy cheap viagra online uk tylenol scholarship 2007 vicodin foreign no prescription pharmacy buy online pill viagra captopril and tylenol inter vaginal tylenol viagra as hypertension medication valium drug info viagra and proper dosage cold tylenol ultram sleep medication tylenol 500 pill ortho tri-cyclen patanol condylox ultram high from ultram er training ultram us licensed pharmaceutical manufacturers viagra samples online tylenol and hangovers tylenol 400 mg tylenol surgery blood domain buy cheap valium 6x to tylenol 325 units vaniqa valtrex flonase ortho tri-cyclen ultram tab grapefruit juice valium meth made from tylenol lowest prices on generic viagra natural viagra valtrex for herpes tylenol for arthritus valium dependency tylenol back and body tylenol cold and synus tylenol measurements ultram 50mg alternatives synthroid tylenol discounted viagra viagra refill valium and grapefruit tylenol problems of continuous use valium and placebo effects cheap generic pill ultram ultram zyrtec n-acetyl-l-cysteine tylenol recreational tylenol infant tylenol canada tylenol with codeine and breastfeeding chldren's tylenol chart online valium without a prescription valtrex yasmin is xanax stronger than valium tylenol scholarship deadline valium pdr overseas pharmacy no prescription vicodin valtrex ortho tri-cyclen cephalexin and tylenol contest game sand tylenol canada viagra cialis on line valtrex valaciclivir without a prescription active ingredient tylenol pm individually wrapped tylenol tylenol liver problems order generic viagra valium addiction and withdrawal chep valium a natural viagra for men tylenol and motrin together tylenol crisis management hemorrhoids tylenol overuse chemical composition of tylenol tylenol extra strength liquid is valium safe during pregnancy valium ingredient 3 codeine in tylenol same as valium valium vx xanax tylenol 10 chewable tylenol weight range 359 celebrex heart lawsuit vioxx 517 tylenol extra strenght codine celebrex vioxx womens viagra tylenol tampered with kills article pediatric tylenol valium versed pharmacology my dog ate tylenol effects heart side surgery viagra viagra online india tylenol dose infants viagra for paxil side effects buy xanax valium online florida mixing tylenol and ibuprofin valium 50mg diazepam and valium tylenol with codine 3 canada pharmacy ultram tylenol market share what is ultram prescription sales viagra valium cheap vicodin codeine allergy valtrex and weight loss purchase ultram approved fda viagra womens tylenol 1 equivalent pain relief online store viagra viagra use in copd european 10mg valium roche valium and purpose drug interactions with valium baby tylenol overdose otc nsaids tylenol tylenol codein order valium without prescription sale viagra viagra hypertension nitroglycerin dose valium tylenol codeine cough online order ultram action class lawsuit minnesota vioxx tylenol blister package tylenol murders articles ultram er drug info tylenol plus aleve simultaneously vicodin money order english natural viagra tylenol 3 how much codiene dangerous dosage of tylenol valium sedation dosage tylenol add buy can reply viagra gay viagra brunswick ohio vioxx heart attack lawyer sildenafil generic viagra informtaion on tenuate diet pills weber shandwick tylenol valium no script fedex what is stronger than valium toothache tylenol or advil mexican prescription drugs names ultram tramidol ultram er drug can tylenol and vicadin mix action celebrex class pregnancy vioxx cheap online purchase ultram are plants in tylenol prescription drugs and valtrex tylenol cod 3 online pharmacy vicodin prescription faxing taking tylenol with codeine while breastfeeding buy ultram where tylenol and xanax ultram online pharmacy valium withdrawal time valium online without a prescription buy cheap prescription ultram tylenol commercial headache puppet viagra sales in uk tylenol aspirin together celebrex and vioxx tylenol affect epileptic headaches valium pills base of tylenol tylenol with codeine similiar tylenol overdose suicide cheap cheap drug drug prescription ultram tylenol and dose dependent valtrex best online pharmacy renova ed duration valium is fexofenadine compatible with tylenol viagra safe for dogs tylenol grains dosing valium what are side effects off viagra tylenol breakdown vicodin 750 es viagra erection time edinburgh pages search viagra report tylenol ingredients celebrex effects free gi side vioxx ultram drug index tylenol cough viagra cialis on line dosage of tylenol for children tylenol codeine viagra for heart attack class action suit vioxx dallas ultracet ultram attack heart jersey lawyer new vioxx tylenol overdose child valtrex over the counter valium drug identification presciption drug valtrex valtrex with free prescription valium alcohol interaction nac tylenol overdose article tylenol 1982 tampering pain medication without asprin or tylenol citrate generic sildenafil viagra drug strong ultram tylenol allergy multi-symptom gelcaps tylenol and aspirin together valium cost vicodin prescription drug for sale valium and ocd viagra below wholesale fatal tylenol overdose tylenol with codeine dose valium withdrawal slow vicodins tylenol danger tylenol 5 reverb pharmaceutical side effects viagra viagra to treat pulmonary hypertension cheap viagra generic car sick dog valium ultram drug test tylenol cod tylenol cold formula natural viagra from safeway tylenol for dog's fever vicodin es overnight delivery chewable valium tylenol history pictures of foreign tylenol packaging mucomyst and tylenol overdose celebrex vioxx lawyer valium ordering tylenol with codeine tylenol scholarship applications tylenol interactions with protonix valium cause depression canadian tylenol 3 buy viagra for women tylenol bottles tylenol advil motrim sleepy time tylenol atenolol and viagra tylenol allergy and sinus motrin vs tylenol effects side viagra make your own viagra press releases coma viagra tylenol ingredients and warnings cheapest place buy viagra online order viagra online uk viagra generic cheap xanax valium overnight prescription valium online jr tylenol meltaways dosages generic brands of viagra online celebrex cheapest lawyer price vioxx mix tylenol and aspirin sign of valium addiction buy female viagra compare valium and xanax tylenol 1 overdose tylenol 8 hour dangers of tylenol overdose overnight valium delivery johnson johnson infant tylenol news viagra drug testing tylenol news offers librium vs valium buy cream online pharmacy tazorac tylenol 10 g valium dosage for dogs side effects viagra tylenol cold sachet china prescription ultram for pain vicodin hydrocodone without prescription pharmacy ultram class action suit vioxx waco tylenol and blood in uriine is ultram a good medication tylenol sleep aid buy now online viagra to buy viagra ultram pharmacy on line valium on the outside it says dog doses of valium action class lawsuit vioxx wisconsin snorting vicodin es viagra san luis rio colorado clonazepam valium vicodin detox at home viagra cost in canada tylenol and cocaine tylenol symptoms valtrex drug reactions viagra woman side effects overdose tylenol child valium 10 rosario mexico pharmacy generic viagra tylenol migraine tylenol and atenolol tylenol pm overdoses information on ultram tab 50 medication tylenol with codein ultracet nursing valium replacement with xanax drug ultram er uses buy xanax valium zolpidem ambien benzodiazepine china valium wholesale gary null's natural viagra valium pill gem snorting tylenol with codeine crush tylenol codeine ultram 50 mg euphoric effects cincinnati ohio vioxx heart attack lawyer vardenafil hydrochloride tablet tylenol codine interraction valium offshore vicodin description