Kris Nuttycombe wrote:
> If you're going to take that approach, why not just make the
> constructor or factory method ensure that the object is in a valid
> state to begin with? When I write immutable objects, they usually
> don't have any setters for that very reason. It doesn't make sense to
> me that one would construct a PayPal object in an unusable state.
>   
Agreed.  The initial "builder" (no longer using the word Constructor per 
Viktor's suggestion) should vend an object that can be used.  Any 
additional state (e.g., useSSL) should return a new instance of a 
mutated object.

As to Viktor's suggestion, having a bunch of builder methods on an 
object rather than an explicit constructor is the right way to go.  e.g.:

trait PayPal {....}

object PayPal {
  def apply(....): PayPal = ....
}

> Kris
>
> On Tue, Sep 23, 2008 at 7:46 PM, David Pollak <[EMAIL PROTECTED]> wrote:
>   
>> Tim,
>>
>> I like the work, but I tend not to like mutable data structures (stuff with
>> properties that one sets.)  I'd structure things such that the PayPal
>> object's "setters" return a new, immutable instance of the PayPal object, so
>> you're code would look like:
>>
>> val pp: PayPal = new
>> PayPal("sandbox").transactionToken(S.param("tx")).useSSL(true)
>>
>> I'd also update the "execute" method so that it returns another immutable
>> object that has current state rather than mutating the original PayPal
>> object.
>>
>> Thanks,
>>
>> David
>>
>> Tim Perrett wrote:
>>
>> Thanks Derek :-) I have commited any code for ages, so its about time
>> I did!
>>
>> My plan is this - once I get this roll out of the site im doing now
>> (which just needs PDT) done, I'll add the IPN functions to it. From
>> the docs, it looks pretty straight forward.
>>
>> You can configure a whole bunch of options like so:
>>
>>     /* values can be "sanbox" or "live" */
>>     var paypal: PayPal = new PayPal("sandbox")
>>     /* self expanitory */
>>     paypal.transactionToken = S.param("tx").openOr("")
>>     /* set if you need to use SSL (changes port and protocol) */
>>     paypal.useSSL = true
>>     /* run the paypal transaction - either with a PDT payload or IPN
>> payload */
>>     paypal.execute("pdt")
>>
>> Anything else / different way of doing it people think I should build
>> in?
>>
>> Tim
>>
>> On Sep 23, 6:24 pm, "Derek Chen-Becker" <[EMAIL PROTECTED]> wrote:
>>
>>
>> Tim, you rock :)
>>
>>
>>
>>
>>     
>
> >
>   

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Lift" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/liftweb?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to